Pełna kopia zapasowa repozytorium Git?

136

Czy istnieje prosty sposób na wykonanie kopii zapasowej całego repozytorium git, w tym wszystkich gałęzi i tagów?

Daniel Upton
źródło
2
Myślę, że odnosisz się tutaj do lokalnych repozytoriów git.
Ztyx
2
możliwy duplikat kopii zapasowej lokalnego repozytorium Git
Martin Thoma
3
Prawidłowa odpowiedź to: git clone --mirror [email protected]/your-repo.git Spowoduje to skopiowanie całego repozytorium, notatek, gałęzi, śledzenia itp.
Jan
Niektóre wyszukiwania w Internecie, które przeprowadziłem, nie zawierały tego pytania w wynikach: "git clone absolutnie wszystko, gałęzie tagi notatki"; "git clone wszystko w repozytorium"; „git clone a repo with all tags notes”.
Kenny Evitt

Odpowiedzi:

64

A co powiesz na zrobienie z tego klonu?

git clone --mirror other/repo.git

Każde repozytorium jest kopią zapasową swojego zdalnego.

KingCrunch
źródło
7
@Daniel: Jeśli sklonujesz repozytorium, pobierasz każdą gałąź, ale tylko domyślna jest pobierana. Spróbuj git branch -a. Może jest to bardziej oczywiste w ten sposób: po sklonowaniu repozytorium nie pobierasz każdej gałęzi, pobierasz każdy commit. Gałęzie odnoszą się tylko do istniejącego zatwierdzenia.
KingCrunch,
1
Myślę, że dobrze zna polecenie klona, ​​jeśli może zadać takie pytanie, a to mu najwyraźniej nie wystarcza (ponieważ jest to klon, a nie zrzut). Zrzuty są różnymi rzeczami jako zwykłe kopie, na przykład: 1) nie są potrzebne, aby były optymalne (lub nawet zdolne) do normalnej pracy 2), ale muszą mieć dobrą odporność i możliwość naprawy przed uszkodzeniem danych.
peterh - Przywróć Monikę
@peterh Jasne, ale git cloneobejmuje to wszystko. (1) jest opcjonalne, nie jest wymagane. Jeśli wynik jest nadal zoptymalizowany, nadal jest to kopia zapasowa (2) jest już objęta przez sam git. - Chodzi mi o to, że skoro git clonejuż omawiamy odpowiednie punkty, to do czego potrzebne jest inne narzędzie? Chociaż wolę też git bundle, żeby moja odpowiedź nie była błędna lub nieprawidłowa. Oba podejścia można postrzegać jako rezerwowe na gorąco i na zimno.
KingCrunch
a co z uprawnieniami do plików? czy git clone koniecznie je kopiuje? zależy od opcji, które wierzę
antirealm
192
git bundle

Podoba mi się ta metoda, ponieważ daje tylko jeden plik, łatwiejszy do skopiowania.
Zobacz ProGit: mały pakiet radości .
Zobacz także „ Jak mogę wysłać komuś wiadomość e-mail z repozytorium git? ”, Gdzie znajduje się polecenie

git bundle create /tmp/foo-all --all

jest szczegółowy:

git bundlezapakuje tylko referencje, które są pokazywane przez git show-ref : obejmuje to głowice, tagi i zdalne głowice.
Bardzo ważne jest, aby podstawa była w posiadaniu miejsca docelowego.
Nie ma nic złego w zachowaniu ostrożności, ponieważ plik pakunku zawiera obiekty już w miejscu docelowym, ponieważ są one ignorowane podczas rozpakowywania w miejscu docelowym.


Aby użyć tego pakietu, możesz go sklonować, określając nieistniejący folder (poza jakimkolwiek repozytorium git):

git clone /tmp/foo-all newFolder
VonC
źródło
11
dodać --all do pełnej kopii zapasowej
sehe
1
To git bundlejest prawidłowa odpowiedź w mojej opinii, a nie akceptowana. Myślę, że dobrze zna polecenie klona, ​​jeśli może zadać takie pytanie, a to mu najwyraźniej nie wystarcza (ponieważ jest to klon, a nie zrzut). Zrzuty to różne rzeczy jako proste kopie, na przykład: 1) nie są potrzebne, aby były optymalne (lub nawet zdolne) do normalnej pracy 2), ale muszą mieć dobrą odporność i możliwość naprawy przed uszkodzeniem danych 3) Często jest przydatne jeśli można je łatwo porównać do przyrostowych kopii zapasowych, podczas gdy nie jest to celem w przypadku kopii.
peterh - Przywróć Monikę
3
Zauważ, że nic nie dostaje git bundlelub nie git clonedostaje wszystkiego , na przykład skrypty przechwytujące.
Zitrax
2
@Zitrax Tak, jest to zgodne z projektem. Haki mogą być niebezpieczne lub zawierać poufne informacje.
VonC
Czy mogę używać git bundleprzeciwko zdalnemu repozytorium?
Ryan Shillington
24

Rozwijając kilka innych odpowiedzi, robię to:

Skonfiguruj repozytorium: git clone --mirror user@server:/url-to-repo.git

Następnie, gdy chcesz odświeżyć kopię zapasową: git remote updatez lokalizacji klonowania.

To tworzy kopię zapasową wszystkich gałęzi i tagów, w tym nowych, które zostaną dodane później, chociaż warto zauważyć, że gałęzie, które są usuwane, nie są usuwane z klonu (co w przypadku kopii zapasowej może być dobrą rzeczą).

To jest atomowe, więc nie ma problemów, jakie miałaby zwykła kopia.

Zobacz http://www.garron.me/en/bits/backup-git-bare-repo.html

fantabolous
źródło
20

Poszerzenie o świetne odpowiedzi KingCrunch i VonC

Połączyłem je oba:

git clone --mirror [email protected]/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

Następnie masz plik o nazwie, reponame.bundlektóry można łatwo skopiować. Następnie możesz utworzyć nowe normalne repozytorium git na podstawie tego za pomocą git clone reponame.bundle reponame.

Zauważ, że git bundlekopiuje tylko zatwierdzenia, które prowadzą do jakiegoś odniesienia (gałęzi lub tagu) w repozytorium. Tak więc splątane zatwierdzenia nie są przechowywane w pakiecie.

Kimmo Ahokas
źródło
1
Dobre podsumowanie. +1.
VonC
2
Myślę, że miałeś na myśli git bundle create reponame.bundle --all?
joe
Dzięki @joe za zauważenie tego. Zdecydowanie. Zaktualizuję odpowiedź.
Kimmo Ahokas
4

Wszystko jest zawarte w .gitkatalogu. Po prostu wykonaj kopię zapasową wraz z projektem, tak jak w przypadku każdego innego pliku.

Oren Hizkiya
źródło
2
Czy to oznacza, że ​​wystarczy wykonać kopię zapasową CAŁEJ zawartości katalogu zawierającego projekt Git?
Ravindranath Akila
1
Zgadzam się z Sunilem - to nie wydaje się być operacją atomową.
jia103
1
Jak zapewnić, że podczas tworzenia kopii zapasowej nie zostaną wprowadzone żadne zmiany w plikach w tym katalogu?
Raedwald
Jak zasugerował Raedwald, ta metoda może spowodować niespójną kopię zapasową, a tym samym doprowadzić do utraty danych. Dlatego tę odpowiedź należy usunąć, a przynajmniej ostrzec o możliwości utraty danych.
Abhishek Anand
Myślę, że on wie, że copyalbo cpnakazuje bardzo dobrze i nie pasuje do jego potrzeb. Myślę też, że myśli o czystym repozytorium (chociaż można je również skopiować, myślę, że nie jest to w pełni funkcjonalna kopia zapasowa).
peterh - Przywróć Monikę
4

użyj pakietu git lub klonuj

kopiowanie katalogu git nie jest dobrym rozwiązaniem, ponieważ nie jest on atomowy. Jeśli masz duże repozytorium, którego kopiowanie zajmuje dużo czasu, a ktoś do niego przesyła, wpłynie to na twoją kopię zapasową. Klonowanie lub tworzenie pakietu nie spowoduje tego problemu.

Sunil Khiatani
źródło
3

Możesz wykonać kopię zapasową repozytorium git za pomocą git-copy przy minimalnym rozmiarze magazynu.

git copy /path/to/project /backup/project.repo.backup

Następnie możesz przywrócić projekt za pomocą git clone

git clone /backup/project.repo.backup project
Quanlong
źródło
2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : to wydaje się dużo pracy dla prostego git clone --bare+ git push --force.
VonC
@VonC Tak, ale może mieć jakąś dodatkową funkcję podczas przepakowywania lub może wydobywać wewnętrzną strukturę repozytorium git, której może użyć do optymalizacji (restrukturyzacja miejsca docelowego lub zwiększenie prędkości itp.).
peterh - Przywróć Monikę
3

Prawidłowa odpowiedź IMO to git clone --mirror . Spowoduje to pełne wykonanie kopii zapasowej repozytorium.

Git clone mirror sklonuje całe repozytorium, notatki, nagłówki, referencje itp. I jest zwykle używany do kopiowania całego repozytorium na nowy serwer git. Spowoduje to zniszczenie wszystkich gałęzi i wszystkiego, całego repozytorium.

git clone --mirror [email protected]/your-repo.git
  • Zwykle klonowanie repozytorium nie obejmuje wszystkich gałęzi, tylko Master.

  • Skopiowanie folderu repozytorium spowoduje "skopiowanie" tylko tych gałęzi, które zostały ściągnięte ... więc domyślnie jest to tylko gałąź główna lub inne gałęzie, które wcześniej wyrejestrowałeś.

  • Polecenie pakietu Git również nie jest tym, czego chcesz: „Polecenie bundle spakuje wszystko, co normalnie byłoby przekazane za pomocą polecenia git push, do pliku binarnego, który możesz wysłać do kogoś pocztą e-mail lub umieścić na dysku flash, a następnie rozpakuj do innego repozytorium. " (Od Jaka jest różnica między git clone --mirror i git clone --bare )

Jan
źródło
Czy git clone --mirror tworzy spójną kopię zapasową w określonym momencie? Co to jest użytkownik wypychający zatwierdzenie podczas tworzenia kopii zapasowej? Czy jest odrzucany, umieszczany w kolejce lub włączany do kopii zapasowej?
Benjamin Goodacre
3

Ten wątek był bardzo pomocny, aby uzyskać wgląd w sposób tworzenia kopii zapasowych repozytoriów git. Myślę, że wciąż brakuje wskazówek, informacji czy wniosków, aby znaleźć „właściwą drogę” (tm) dla siebie. Dlatego dzielę się tutaj moimi przemyśleniami, aby pomóc innym i poddać je dyskusji, aby je wzmocnić. Dzięki.

A więc zaczynając od odpowiedzi na pierwotne pytanie:

  • Celem jest jak największe zbliżenie się do „pełnej” kopii zapasowej repozytorium git.

Następnie wzbogacając go o typowe życzenia i określając niektóre ustawienia wstępne:

  • Preferowane jest tworzenie kopii zapasowych „na gorąco”, aby uniknąć przestojów usług.
  • Wady gita zostaną omówione przez dodatkowe polecenia.
  • Skrypt powinien wykonać kopię zapasową, aby połączyć wiele kroków dla jednej kopii zapasowej i uniknąć błędów ludzkich (literówki itp.).
  • Dodatkowo skrypt powinien wykonać przywracanie w celu dostosowania zrzutu do maszyny docelowej, np. Nawet konfiguracja oryginalnej maszyny mogła ulec zmianie od czasu utworzenia kopii zapasowej.
  • Środowisko to serwer git na komputerze z systemem Linux z systemem plików obsługującym twarde łącza.

1. Co to jest „pełna” kopia zapasowa repozytorium git?

Punkt widzenia różni się od tego, czym jest kopia zapasowa „100%”. Oto dwa typowe.

# 1 Punkt widzenia programisty

  • Zadowolony
  • Bibliografia

git to narzędzie programistyczne, które obsługuje ten punkt widzenia za pośrednictwem git clone --mirrori git bundle --all.

# 2 Punkt widzenia administratora

  • Pliki treści
    • Przypadek specjalny „packfile”: git łączy i kompaktuje obiekty do plików packfile podczas czyszczenia pamięci (zobacz git gc)
  • konfiguracja git
  • Opcjonalnie: konfiguracja systemu operacyjnego (uprawnienia systemu plików itp.)

git jest narzędziem programistycznym i pozostawia to administratorowi. Kopię zapasową konfiguracji git i konfiguracji systemu operacyjnego należy traktować jako oddzielną od kopii zapasowej zawartości.

2. Techniki

  • „Cold-Copy”
    • Zatrzymaj usługę, aby mieć wyłączny dostęp do jej plików. Przestój!
  • „Hot-Copy”
    • Usługa zapewnia stały stan do celów kopii zapasowych. Bieżące zmiany nie wpływają na ten stan.

3. Inne tematy do przemyślenia

Większość z nich ma charakter ogólny do tworzenia kopii zapasowych.

  • Czy jest wystarczająco dużo miejsca, aby pomieścić pełne kopie zapasowe? Ile pokoleń będzie przechowywanych?
  • Czy potrzebne jest podejście przyrostowe? Ile pokoleń będzie przechowywanych i kiedy ponownie utworzyć pełną kopię zapasową?
  • Jak sprawdzić, czy kopia zapasowa nie jest uszkodzona po utworzeniu lub w czasie?
  • Czy system plików obsługuje twarde łącza?
  • Umieścić kopię zapasową w jednym pliku archiwum lub użyć struktury katalogów?

4. Co git zapewnia do tworzenia kopii zapasowych zawartości

  • git gc --auto

    • docs: man git-gc
    • Czyści i kompaktuje repozytorium.
  • git bundle --all

    • docs: man git-bundle, man git-rev-list
    • Atomic = „Hot-Copy”
    • Pakiety są plikami zrzutu i mogą być bezpośrednio używane z git (weryfikacja, klonowanie itp.).
    • Obsługuje ekstrakcję przyrostową.
    • Weryfikowalne przez git bundle verify.
  • git clone --mirror

    • docs: man git-clone, man git-fsck, Jaka jest różnica między git clone --mirror i git clone --bare
    • Atomic = „Hot-Copy”
    • Mirrory to prawdziwe repozytoria git.
    • Podstawową intencją tego polecenia jest zbudowanie pełnego aktywnego serwera lustrzanego, który okresowo pobiera aktualizacje z oryginalnego repozytorium.
    • Obsługuje twarde łącza do serwerów lustrzanych w tym samym systemie plików, aby uniknąć marnowania miejsca.
    • Weryfikowalne przez git fsck.
    • Mirrory mogą służyć jako podstawa do pełnego skryptu kopii zapasowej plików.

5. Kopia na zimno

Kopia zapasowa kopia zimno może zawsze zrobić pełną kopię zapasową pliku: zaprzeczyć wszystkie dostępy do repo git, czy tworzenie kopii zapasowych i ponownie umożliwić dostępy.

  • Możliwe problemy
    • Może nie być łatwe - lub nawet możliwe - odmowa dostępu, np. Współdzielony dostęp przez system plików.
    • Nawet jeśli repozytorium znajduje się na komputerze tylko klienckim z jednym użytkownikiem, użytkownik nadal może popełnić coś podczas automatycznego wykonywania kopii zapasowej :(
    • Przestoje mogą być nie do zaakceptowania na serwerze, a tworzenie kopii zapasowych wielu dużych repozytoriów może zająć dużo czasu.
  • Pomysły na łagodzenie skutków:
    • Generalnie zapobiegaj bezpośredniemu dostępowi do repozytoriów za pośrednictwem systemu plików, nawet jeśli klienci znajdują się na tym samym komputerze.
    • W przypadku dostępu SSH / HTTP użyj menedżerów autoryzacji git (np. Gitolite), aby dynamicznie zarządzać dostępem lub modyfikować pliki uwierzytelniające w sposób skryptowy.
    • Kopie zapasowe repozytorium jeden po drugim, aby skrócić przestoje dla każdego repozytorium. Odrzuć jedno repozytorium, wykonaj kopię zapasową i ponownie zezwól na dostęp, a następnie przejdź do następnego repozytorium.
    • Zaplanuj harmonogram konserwacji, aby uniknąć zdenerwowania programistów.
    • Kopia zapasowa tylko po zmianie repozytorium. Może bardzo trudne do zaimplementowania, np. Lista obiektów plus uwzględnienie plików packfile, sum kontrolnych konfiguracji i hooków itp.

6. Hot-Copy

Kopie zapasowe plików nie mogą być wykonywane z aktywnymi repozytoriami ze względu na ryzyko uszkodzenia danych w wyniku trwających zatwierdzeń. Gorąca kopia zapewnia stały stan aktywnego repozytorium na potrzeby tworzenia kopii zapasowych. Bieżące zatwierdzenia nie wpływają na tę kopię. Jak wspomniano powyżej, funkcje klonowania i paczki gita to obsługują, ale w przypadku kopii zapasowej „100% administratora” należy wykonać kilka czynności za pomocą dodatkowych poleceń.

Kopia zapasowa „100% administratora”

  • Opcja 1: użyj git bundle --alldo tworzenia pełnych / przyrostowych plików zrzutu zawartości i kopiowania / tworzenia kopii zapasowych plików konfiguracyjnych oddzielnie.
  • Opcja 2: git clone --mirrorosobno używaj , obsługuj i kopiuj konfigurację, a następnie wykonaj pełną kopię zapasową pliku lustrzanego.
    • Uwagi:
    • Lustro to nowe repozytorium, które jest zapełniane aktualnym szablonem git podczas tworzenia.
    • Wyczyść pliki konfiguracyjne i katalogi, a następnie skopiuj pliki konfiguracyjne z oryginalnego repozytorium źródłowego.
    • Skrypt kopii zapasowej może również zastosować konfigurację systemu operacyjnego, na przykład uprawnienia do plików na serwerze lustrzanym.
    • Użyj systemu plików obsługującego dowiązania twarde i utwórz kopię lustrzaną na tym samym systemie plików, co repozytorium źródłowe, aby zwiększyć szybkość i zmniejszyć zużycie miejsca podczas tworzenia kopii zapasowych.

7. Przywróć

  • Sprawdź i zastosuj konfigurację git do maszyny docelowej i najnowszą filozofię „sposobu działania”.
  • Sprawdź i zastosuj konfigurację systemu operacyjnego do maszyny docelowej i najnowszą filozofię „sposobu działania”.
Maddes
źródło
0
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master

tworzy to kopię zapasową i dokonuje konfiguracji, dzięki czemu możesz wykonać polecenie git push, aby zaktualizować kopię zapasową, co prawdopodobnie jest tym, co chcesz zrobić. Upewnij się tylko, że / path / to / backupdir i / path / to / repo to co najmniej różne dyski twarde, w przeciwnym razie nie ma to większego sensu.

Arne
źródło
Myślę, że dobrze zna polecenie klona, ​​jeśli może zadać takie pytanie, a to mu najwyraźniej nie wystarcza (ponieważ jest to klon, a nie zrzut). Zrzuty to różne rzeczy jako proste kopie, na przykład: 1) nie są potrzebne, aby były optymalne (lub nawet zdolne) do normalnej pracy 2), ale muszą mieć dobrą odporność i możliwość naprawy przed uszkodzeniem danych 3) Często jest przydatne jeśli można je łatwo porównać do przyrostowych kopii zapasowych, podczas gdy nie jest to celem w przypadku kopii.
peterh - Przywróć Monikę
0

Oto dwie opcje:

  1. Możesz bezpośrednio pobrać plik tar z katalogu repozytorium git, ponieważ zawiera on całą zawartość repozytorium na serwerze. Istnieje niewielka możliwość, że ktoś może pracować nad repozytorium podczas tworzenia kopii zapasowej.

  2. Następujące polecenie da ci czysty klon repozytorium (tak jak na serwerze), a następnie możesz bez problemu pobrać plik tar z lokalizacji, w której sklonowałeś.

    git clone --bare {your backup local repo} {new location where you want to clone}
    
vishal sahasrabuddhe
źródło
Myślę, że dobrze zna polecenie clone lub tar, jeśli może zadać takie pytanie, a to mu najwyraźniej nie wystarcza (ponieważ jest to klon, a nie zrzut). Zrzuty to różne rzeczy jako proste kopie, na przykład: 1) nie są potrzebne, aby były optymalne (lub nawet zdolne) do normalnej pracy 2) ale muszą mieć dobrą odporność i możliwość naprawy przed uszkodzeniem danych 3) Często jest przydatne jeśli można je łatwo porównać do przyrostowych kopii zapasowych, podczas gdy nie jest to celem w przypadku kopii.
peterh - Przywróć Monikę
3
peterh, Zdecydowanie nie prosił o polecenie tar ani clone. Jeśli przyjrzysz się uważnie, nie wyjaśniłem też tego polecenia. To, co próbowałem wyjaśnić, to kopia zapasowa Git za pomocą innej metody, która może obejmować różne polecenia Linuksa, co nie oznacza, że ​​uczę tych poleceń Linuksa. Próbuję tu umieścić kilka pomysłów.
vishal sahasrabuddhe
0

Jeśli jest na Github, przejdź do bitbucket i użyj metody „import repository”, aby zaimportować repozytorium github jako repozytorium prywatne.

Jeśli jest w bitbuckecie, zrób na odwrót.

Jest to pełna kopia zapasowa, ale pozostaje w chmurze, co jest moją idealną metodą.

Mohammad
źródło
-7

O ile wiem, możesz po prostu zrobić kopię katalogu, w którym znajduje się repozytorium, to wszystko!

cp -r project project-backup
Richard Tuin
źródło
Czy ktoś może to potwierdzić? Uważam, że jest to właściwe podejście do tworzenia właściwej kopii zapasowej.
Ravindranath Akila
5
Myślę, że możesz skończyć z niespójną migawką, gdy podczas operacji kopiowania zmiany są zatwierdzane / wysyłane do repozytorium. Użycie poleceń git, takich jak git clone --bare, daje spójny obraz.
Eelke,
1
Zgadzam się z Sunilem - to nie wydaje się być atomowe.
jia103
1
@ jia103 Nie zawsze jest to problem, jeśli nie jest atomowy - wystarczy wiedzieć i być w stanie zagwarantować, że nikt inny nie może dotrzeć do repozytorium podczas pracy nad nim. Ale myślę, że OP chce konkretnego, zoptymalizowanego dla repozytoriów git narzędzia do tego zadania, proste kopiowanie plików jest prawdopodobnie dobrze mu znane.
peterh - Przywróć Monikę