2009-12-11 10 views
17

Idź na mnie, nie jestem człowiekiem linii poleceń ... Mamy GIT skonfigurowany w naszej sieci Windows (używając msysgit & GitExtensions). Każdy z nas ma własne repozytorium i popychamy do zdalnego repozytorium na jednym z naszych serwerów. Wszystko dobrze.Klon GIT na dysk zewnętrzny do backupu

Próbuję skonfigurować zaplanowane zadanie na serwerze, które sklonuje repozytorium z dysku C na dysk zewnętrzny (na F) - z pewnymi trudnościami w uzyskaniu tego działania. Mogę to zrobić stosunkowo łatwo, ale nie jestem pewien, jak zapisać to w pliku wsadowym, który mogę następnie scehdule.

Co mam tak daleko:

rmdir F:\GitClone /s /q 
mkdir F:\GitClone 
mkdir F:\GitClone\Repo1 
CD /D F:\GitClone\Repo1\ 
GIT CLONE /c/GIT/Repo1/ 

Próbowałem zostały również następujące po ostatnim wierszu:

GIT CLONE C:\GIT\Repo1\ 

Ale to nie działa albo ... Jestem trochę zakłopotany i byłby wdzięczny za pomoc. Dysk C zawiera nasze gołe repozytoriów i napęd F jest nasz zewnętrzny napęd, że zamienią się codziennie ...


kilka odpowiedzi tutaj, że były bardzo przydatne, dzięki. Moja wynikowa odpowiedź to prawdopodobnie ich kombinacja, więc wskazuje na to, jak uruchomić skrypt basha i jak skryptować ciągnięcie/pchnięcie.

Musisz je połączyć, aby działała tak, aby była szczęśliwa, gdy różne dyski są wymieniane i wymieniane (np. Klonuj repozytorium, jeśli nie istnieje na dysku zewnętrznym, a następnie usuwaj różnice inaczej), ale to powinno być wykonalne. Dziękuje za wszystko.

Odpowiedz

26

Należy pamiętać, że sama git jest doskonała podczas kopiowania tylko potrzebnych zmian do sklonowanego repozytorium.

Jeśli chcesz regularnie aktualizować kopię repo, wykonaj następujące czynności: Utwórz repozytorium jako repozytorium kopii zapasowych, a następnie wielokrotnie przesyłaj wszystkie nowe zmiany (nie trzeba usuwać starej kopii zapasowej).

Ok, zacznijmy od tworzenia repo

$ cd /tmp 
$ mkdir myrepo && cd myrepo 
$ touch hi && git add . && git commit -m "bla" 

Tak, jest to repozytorium. Teraz możemy stworzyć klona:

$ cd /tmp 
$ mkdir backup && cd backup 
$ git --bare init 
Initialized empty Git repository in /tmp/backup/ 

A teraz skonfigurować repo dla regularnych kopii zapasowych ...

$ cd /tmp/myrepo 
$ git remote add backup /tmp/backup 
$ git config remote.backup.mirror true 

Następnie należy skopiować wszystko do kopii zapasowej:

$ git push backup 
Counting objects: 3, done. 
Writing objects: 100% (3/3), 206 bytes, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /tmp/backup 
* °new branch§  master -> master 

i sprawdzić, czy to zadziałało :

$ cd /tmp/backup 
$ git log 
commit d027b125166ff3a5be2d7f7416893a012f218f82 
Author: Niko Schwarz <niko.schwarzàgmail.com> 
Date: Fri Dec 11 12:24:03 2009 +0100 

    hi 

Tad a, jesteś ustawiony. Dlatego cały skrypt musi zrobić, to wydać git push backup. Nie ma potrzeby wielokrotnego wyrzucania starej kopii zapasowej.

Alternatywą jest może masz rsync robić to wszystko dla Ciebie:

rsync -av rsync://rsync.samba.org/ftp/unpacked/rsync /dest/dir/ 

użytkownika Offby dodaje: Od wersji 1.5.4, "git remote add" wykonuje "--mirror" opcji, co oszczędza zarówno od konieczności "git config remote.origin.mirror true", jak i od konieczności przekazania --mirror do "git push".

+0

dlaczego jesteś rsyncing od gołego repo? Nie będzie żadnych wyrejestrowanych plików. Jeśli użyjesz opcji --exclude = .git /, z zasady nic nie skopiujesz. Ponadto, dlaczego twoje repositroy naciska na kopię zapasową? Dlaczego kopia zapasowa nie pochodzi z repozytorium? – Pod

+0

Nie jestem, proponuję dwa różne sposoby: rsyncing lub kopiowanie do gołego repo do kopiowania. Moim zdaniem bardziej naturalne jest popychanie kopii zapasowej niż wyciąganie jej. – nes1983

+0

Ach, teraz widzę co masz na myśli, przepraszam, oświadczenie wykluczające wpadło przez pomyłkę. – nes1983

4

Można zawsze wystarczy zaplanować bash.exe mybashbackupscript.sh

W każdym razie, jeśli chodzi Okna:

rmdir F:\GitClone /s /q 
mkdir -p F:\GitClone\Repo1 
copy c:\GIT\Repo1\.git F:\GitClone\Repo1\.git 

git clone naprawdę nie ma niczego bardziej wyszukane niż.

edytuj: jak ktoś inny zwrócił uwagę, najlepiej jest po prostu zrobić nowe ponowne utworzenie kopii zapasowej i po prostu wciągnąć/pobrać do tego. Będziesz uniknąć wszelkich problemów accesing z .git :)

+0

To trochę moje myślenie na minutę. – Paddy

4

Ponieważ komenda git jest trochę dziwne, trzeba użyć call wykonać wszelkie polecenia git z pliku wsadowego:

rmdir F:\GitClone /s /q 
mkdir F:\GitClone 
CD /D F:\GitClone\ 
call GIT CLONE c/GIT/Repo1/ 
+0

to był mój problem, –

1

Niestety, nie mogę komentuje posty, ale ja też myślałem o kopiowaniu .git, ale co się stanie, jeśli plik .git zostanie skopiowany podczas przeciągania?

W każdym razie, po co kopiować całą zawartość, ponieważ od czasu do czasu można pobrać delty?

Inicjowanie tworzenia kopii zapasowych (w F: \ GitClone \ Repo1 pusty)

git init 
git add remote origin /c/GIT/Repo1 

Wtedy twój "skrypt do backupu delta" byłoby po prostu zrobić:

cd /f/GitClone/Repo1 
git fetch origin 
0

Dlaczego usuwasz klona cały czas? Jaki jest sens klonowania istniejącego repozytorium, gdy chcesz tylko skopiować plik?

Wystarczy utworzyć repo na dysku zewnętrznym (przy git cloneraz), a następnie regularnie prowadzony git pull na nim.

+0

Dyski te są codziennie wymieniane i wymieniane - chcę się upewnić, że zostaną utworzone, o ile już tam nie ma. – Paddy

0

Problem rozwiązany:

h: (flash drive) 
cd \ 
mkdir YourProject 
cd YourProject 
git init 
git remote add origin [email protected]:user/YourProject.git 
git remote add local C:\w\YourProject 
git pull origin master 
git push local master 
Powiązane problemy