Czy istnieje prosty sposób na wykonanie kopii zapasowej całego repozytorium git, w tym wszystkich gałęzi i tagów?
Czy istnieje prosty sposób na wykonanie kopii zapasowej całego repozytorium git, w tym wszystkich gałęzi i tagów?
Odpowiedzi:
A co powiesz na zrobienie z tego klonu?
git clone --mirror other/repo.git
Każde repozytorium jest kopią zapasową swojego zdalnego.
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.
git clone
obejmuje 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 clone
już 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.
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 bundle
zapakuje 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
git bundle
jest 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.
git bundle
lub nie git clone
dostaje wszystkiego , na przykład skrypty przechwytujące.
git bundle
przeciwko zdalnemu repozytorium?
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 update
z 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
Poszerzenie o świetne odpowiedzi KingCrunch i VonC
Połączyłem je oba:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Następnie masz plik o nazwie, reponame.bundle
któ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 bundle
kopiuje 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.
git bundle create reponame.bundle --all
?
Wszystko jest zawarte w .git
katalogu. Po prostu wykonaj kopię zapasową wraz z projektem, tak jak w przypadku każdego innego pliku.
copy
albo cp
nakazuje 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).
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.
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
git clone --bare
+ git push --force
.
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 git@example.com/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 )
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:
Następnie wzbogacając go o typowe życzenia i określając niektóre ustawienia wstępne:
Punkt widzenia różni się od tego, czym jest kopia zapasowa „100%”. Oto dwa typowe.
git to narzędzie programistyczne, które obsługuje ten punkt widzenia za pośrednictwem git clone --mirror
i git bundle --all
.
git gc
)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.
Większość z nich ma charakter ogólny do tworzenia kopii zapasowych.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.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.
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ń.
git bundle --all
do tworzenia pełnych / przyrostowych plików zrzutu zawartości i kopiowania / tworzenia kopii zapasowych plików konfiguracyjnych oddzielnie.git clone --mirror
osobno używaj , obsługuj i kopiuj konfigurację, a następnie wykonaj pełną kopię zapasową pliku lustrzanego.
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.
Oto dwie opcje:
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.
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}
O ile wiem, możesz po prostu zrobić kopię katalogu, w którym znajduje się repozytorium, to wszystko!
cp -r project project-backup
git clone --bare
, daje spójny obraz.