Git deposunu tamamen yedekle?


136

Tüm şubeleri ve etiketleri içeren tüm bir git deposunu yedeklemenin basit bir yolu var mı?


2
Sanırım burada yerel bir git depolarına atıfta bulunuyorsunuz.
Ztyx


3
Doğru cevap şu yapmaktır: git clone --mirror git@example.com/your-repo.git Bu, tüm deponuzu, notlarınızı, dallarınızı, takibinizi vb. Kopyalar.
John

Bu soruyu sonuçlarına dahil etmediğim bazı web aramaları: "git klonu kesinlikle her şey dallar etiketleri notları"; "git depodaki her şeyi klonla"; msgstr "git tüm etiketleri notlarla bir repo klonla".
Kenny Evitt

Yanıtlar:


64

Sadece bir klon yapmak nedir?

git clone --mirror other/repo.git

Her depo, uzaktan kumandasının bir yedeğidir.


7
@Daniel: Bir havuzu klonlarsanız, her dalı alırsınız, ancak yalnızca varsayılan olanı denetlenir. Deneyin git branch -a. Belki de bu şekilde daha açıktır: Bir havuzu klonladıktan sonra her dalı getirmezsiniz, her taahhüdü alırsınız. Şubeler sadece mevcut bir taahhüdü ifade eder.
KingCrunch

1
Sanırım klon komutunu iyi biliyor, eğer böyle bir soru sorabilirse ve açıkça onun için yeterli değil (çünkü bir klon ve dökümü değil). Çöplükler, basit kopyalar gibi farklı şeylerdir, örneğin: 1) normal çalışma için en uygun (hatta yetenekli) olmaları gerekmez 2) ancak verilerin bozulmasına karşı iyi bir dirence ve tamir edilebilirliğe sahip olmaları gerekir.
peterh - Monica

@peterh Elbette, ama git clonehepsini kapsar. (1) isteğe bağlıdır, bir gereklilik değildir. Sonuç yine de optimize edilmişse, yine de git kendisi tarafından kapsanan bir yedek (2). - Vermek istediğim nokta, git clonezaten ilgili noktaları kapsıyorsanız, farklı bir araca ihtiyacınız olan şey mi? Her ne kadar tercih git bundleetsem de cevabımın yanlış veya geçersiz olduğunu düşünmüyorum. Her iki yaklaşımı da sıcak ve soğuk yedekleme olarak görebilirsiniz.
KingCrunch

dosya izinleri ne olacak? git klonu mutlaka bunları kopyalar mı? inandığım seçeneklere bağlı
antirealm

192
git bundle

Bu yöntemi seviyorum, çünkü sadece bir dosyayla sonuçlanır, kopyalanması daha kolaydır. ProGit'e
bakın : küçük bir neşe paketi .
Ayrıca bkz. " Birisine git deposunu nasıl e-postayla gönderebilirim? "

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

detaylı:

git bundleyalnızca git show-ref ile gösterilen referansları paketleyecektir : buna kafalar, etiketler ve uzak kafalar dahildir.
Kullanılan temelin hedef tarafından tutulması çok önemlidir.
Dikkatli bir şekilde hata yapmak uygun olabilir, bu da paket dosyasının hedefte zaten nesneler içermesine neden olur, çünkü bunlar hedefte paketten çıkarılırken yok sayılır.


Bu paketi kullanmak için, var olmayan bir klasör belirterek klonlayabilirsiniz (herhangi bir git repo'sunun dışında):

git clone /tmp/foo-all newFolder

11
add --all tam yedekleme için
sehe

1
Bu, git bundlebenim görüşüm için doğru cevap ve kabul edilen cevap değil. Sanırım klon komutunu iyi biliyor, eğer böyle bir soru sorabilirse ve açıkça onun için yeterli değil (çünkü bir klon ve dökümü değil). Çöplükler basit kopyalar gibi farklı şeylerdir, örneğin: 1) normal çalışma için optimal (veya hatta yetenekli) olmaları gerekmez 2) ancak veri bozulmasına karşı iyi bir dirence ve tamir edilebilirliğe sahip olmaları gerekir 3) Genellikle yararlıdır kopyalar için bir hedef olmasa da, artımlı yedeklemeler için kolayca fark edilebiliyorsa.
peterh - Monica

3
Ne Not git bundleveya git clonealır her şeyi , örneğin kanca komut.
Zitrax

2
@Zitrax Evet, tasarım gereği. Kancalar tehlikeli olabilir veya hassas bilgiler içerebilir.
VonC

git bundleUzak bir depoya karşı kullanabilir miyim ?
Ryan Shillington

24

Diğer bazı cevapları genişleterek, yaptığım şey bu:

Repo kurulumu: git clone --mirror user@server:/url-to-repo.git

Ardından yedeklemeyi yenilemek istediğinizde: git remote updateklon konumundan.

Bu, daha sonra eklenecek olanlar da dahil olmak üzere tüm dalları ve etiketleri yedekler, ancak silinen dalların klondan silinmediğini (yedek için iyi bir şey olabilir) belirtmek gerekir.

Bu atomiktir, bu yüzden basit bir kopyanın yapacağı problemler yoktur.

Bkz. Http://www.garron.me/en/bits/backup-git-bare-repo.html


20

Tarafından büyük cevaplara Genişleyen KingCrunch ve VonC

İkisini de birleştirdim:

git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

Bundan sonra reponame.bundlekolayca kopyalanabilecek bir dosyanız var . Daha sonra bunu kullanarak yeni bir normal git deposu oluşturabilirsiniz git clone reponame.bundle reponame.

git bundleYalnızca depoda bazı referanslara (dal veya etiket) yol açan kopyaların kaydedildiğini unutmayın . Bu nedenle karışıklık taahhütleri pakete kaydedilmez.


1
İyi özet. +1.
VonC

2
Sanırım demek istedin git bundle create reponame.bundle --all?
joe

Bunu fark ettiğiniz için teşekkürler jojo. Kesinlikle. Cevabı güncelleyeceğim.
Kimmo Ahokas

4

Her şey .gitdizinde bulunur. Sadece projenizle birlikte herhangi bir dosya gibi yedekleyin.


2
Bu, Git projesini içeren dizinin TÜM içeriklerini yedeklemek yeterli olduğu anlamına mı geliyor?
Ravindranath Akila

1
Sunil ile aynı fikirde - bu atomik bir işlem gibi görünmüyor.
jia103

1
Yedeklemeyi oluştururken bu dizindeki dosyalarda hiçbir değişiklik yapılmamasını nasıl sağlarsınız?
Raedwald

Raedwald'ın belirttiği gibi, bu yöntem tutarsız bir yedeklemeye ve dolayısıyla veri kaybına yol açabilir. Bu nedenle, bu cevap kaldırılmalı veya en azından veri kaybı olasılığı konusunda uyarılmalıdır.
Abhishek Anand

Bence çok iyi biliyor copyya da cpemrediyor ve bu onun ihtiyaçlarına uygun değil. Ayrıca bence, çıplak bir depo düşünüyor (her ne kadar kopyalanabilse de, tam özellikli bir yedekleme olmadığını düşünüyorum).
peterh - Monica

4

git paketini kullan veya klonla

git dizinini kopyalamak atomik olmadığı için iyi bir çözüm değildir. Kopyalanması uzun süren büyük bir deponuz varsa ve birisi deponuza iterse, yedeklemenizi etkileyecektir. Klonlama veya bir paket oluşturmada bu sorun olmaz.


3

Git deposunu minimum depolama boyutunda git-copy ile yedekleyebilirsiniz .

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

Ardından projenizi git clone

git clone /backup/project.repo.backup project

2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : basit bir git clone --bare+ için çok iş gibi görünüyor git push --force.
VonC

@VonC Evet, ancak yeniden paketleme sırasında bazı ek özelliklere sahip olabilir veya git repo'nun iç yapısını kullanabilir, bu da bazı optimizasyon (hedefin yeniden yapılandırılması veya hız artışı vb.) İçin kullanabilir.
peterh - Monica

3

Doğru cevap IMO git klon - ayna . Bu, deponuzu tamamen yedekleyecektir.

Git klonu aynası tüm deposu, notları, kafaları, referansları vb. Klonlar ve genellikle bir deponun tamamını yeni bir git sunucusuna kopyalamak için kullanılır. Bu, tüm dalları ve her şeyi, tüm depoyu aşağı çekecektir .

git clone --mirror git@example.com/your-repo.git
  • Normalde bir repo klonlama tüm dalları içermez, sadece Master'ı içerir.

  • Repo klasörünün kopyalanması yalnızca içeri aktarılan dalları "kopyalayacaktır", bu nedenle varsayılan olarak yalnızca Ana dal veya daha önce teslim aldığınız diğer dallardır.

  • Git bundle komutu da istediğiniz gibi değil: "Bundle komutu normalde bir git push komutuyla tel üzerinden itilecek her şeyi birisine e-posta gönderebileceğiniz veya bir flash sürücüye koyabileceğiniz bir ikili dosyaya paketleyecek, başka bir depoya ayrılır. " ( Git klonu - ayna ve git klonu - çıplak arasındaki fark nedir? )


Git clone --mirror tutarlı bir zaman içinde yedekleme oluşturur mu? Kullanıcı yedekleme sırasında bir taahhütte bulunur? Reddedildi, kuyruğa alındı ​​veya yedeklemeye dahil edildi mi?
Benjamin Goodacre

3

Bu iş parçacığı git depolarının yedeklemelerinin nasıl yapılabileceği hakkında bazı bilgiler almak için çok yardımcı oldu. Kendisi için "doğru yolu" (tm) bulmanın bazı ipuçları, bilgiler ya da sonuçlardan yoksun olduğunu düşünüyorum. Bu nedenle, başkalarına yardım etmek ve onları geliştirmek için tartışmalara hazırlamak için düşüncelerimi burada paylaşmak. Teşekkürler.

Bu yüzden orijinal soruyu cevaplayarak:

  • Amaç git deposunun "tam" yedeklemesine mümkün olduğunca yaklaşmaktır.

Sonra onu tipik isteklerle zenginleştirin ve bazı ön ayarları belirtin:

  • Hizmet kesintilerini önlemek için "etkin kopya" ile yedekleme tercih edilir.
  • Git eksiklikleri ek komutlarla çözülecektir.
  • Bir komut dosyası, tek bir yedekleme için birden çok adımı birleştirmek ve insan hatalarından (yazım hataları, vb.) Kaçınmak için yedeklemeyi yapmalıdır.
  • Ek olarak bir komut dosyası, dökümü hedef makineye uyarlamak için geri yüklemeyi gerçekleştirmelidir, örn. Orijinal makinenin yapılandırması bile yedeklemeden bu yana değişmiş olabilir.
  • Ortam, Linux makinelerinde sabit bağlantıları destekleyen bir dosya sistemine sahip bir git sunucusudur.

1. "Tam" git repo yedeği nedir?

Bakış açısı, "% 100" yedeklemenin ne olduğuna göre değişir. İşte iki tipik.

# 1 Geliştiricinin bakış açısı

  • içerik
  • Referanslar

git bir geliştirici aracı ve üzeri bu bakış açısı desteklemektedir git clone --mirrorve git bundle --all.

# 2 Yönetici'nin bakış açısı

  • İçerik dosyaları
    • Özel durum "packfile": git çöp toplama sırasında nesneleri packfiles halinde birleştirir ve sıkıştırır (bkz. git gc)
  • git yapılandırma
  • İsteğe bağlı: İşletim sistemi yapılandırması (dosya sistemi izinleri vb.)

git bir geliştirici aracıdır ve bunu yöneticiye bırakır. Git yapılandırmasının ve OS yapılandırmasının yedeklenmesi, içeriğin yedeklemesinden ayrı olarak görülmelidir.

2. Teknikler

  • "Soğuk Kopyala"
    • Dosyalarına özel erişim için hizmeti durdurun. Kesinti!
  • "Sıcak Kopyala"
    • Hizmet, yedekleme amacıyla sabit bir durum sağlar. Devam eden değişiklikler bu durumu etkilemez.

3. Düşünülmesi gereken diğer konular

Çoğu yedeklemeler için geneldir.

  • Tam yedeklemeleri almak için yeterli alan var mı? Kaç nesil saklanacak?
  • Artımlı bir yaklaşım mı isteniyor? Kaç nesil saklanacak ve ne zaman tekrar tam yedek oluşturulacak?
  • Bir yedeklemenin oluşturma işleminden sonra veya zaman içinde bozulmadığını nasıl doğrularız?
  • Dosya sistemi sabit bağlantıları destekliyor mu?
  • Yedeklemeyi tek bir arşiv dosyasına mı koyuyorsunuz, yoksa dizin yapısını mı kullanıyorsunuz?

4. git içeriği yedeklemek için neler sağlar

  • git gc --auto

    • dokümanlar: man git-gc
    • Bir havuzu temizler ve sıkıştırır.
  • git bundle --all

    • dokümanlar: man git-bundle, man git-rev-list
    • Atomic = "Sıcak Kopya"
    • Paketler döküm dosyalarıdır ve git (doğrulama, klonlama vb.) İle doğrudan kullanılabilir.
    • Artımlı ekstraksiyonu destekler.
    • İle doğrulanabilir git bundle verify.
  • git clone --mirror

    • dokümanlar: man git-clone, man git-fsck, git clone --mirror ve git clone --bare arasındaki fark nedir
    • Atomic = "Sıcak Kopya"
    • Aynalar gerçek git depolarıdır.
    • Bu komutun birincil amacı, düzenli olarak orijinal depodan güncellemeler alan tam bir etkin ayna oluşturmaktır.
    • Alan israfını önlemek için aynı dosya sistemindeki aynalar için sabit bağlantıları destekler.
    • İle doğrulanabilir git fsck.
    • Aynalar, tam dosya yedekleme komut dosyası için temel olarak kullanılabilir.

5. Soğuk Kopyalama

Soğuk kopya yedeklemesi her zaman tam dosya yedeklemesi yapabilir: git depolarına tüm erişimi reddedin , yedekleyin ve tekrar erişime izin verin.

  • Olası Sorunlar
    • Tüm erişimi reddetmek kolay olmayabilir, hatta mümkün olmayabilir, örneğin dosya sistemi üzerinden paylaşılan erişimi.
    • Repo, tek bir kullanıcıya sahip yalnızca istemci bir makinede olsa bile, kullanıcı otomatik yedekleme çalışması sırasında yine de bir şeyler yapabilir :(
    • Kesinti süresi sunucuda kabul edilemeyebilir ve birden fazla dev depo yedeklemesi yapmak uzun sürebilir.
  • Etki Azaltma Fikirleri:
    • İstemciler aynı makinede olsa bile, genel olarak dosya sistemi üzerinden doğrudan repo erişimini önleyin.
    • SSH / HTTP erişimi için, erişimi dinamik olarak yönetmek veya kimlik doğrulama dosyalarını komut dosyasıyla değiştirmek için git yetkilendirme yöneticilerini (örn. Gitolit) kullanın.
    • Her repo için kapalı kalma süresini azaltmak için yedekleri tek tek yedekleyin. Bir repoyu reddedin, yedekleyin ve tekrar erişime izin verin, ardından bir sonraki repoya devam edin.
    • Geliştiricilerin üzülmesini önlemek için planlı bakım planlaması yapın.
    • Yalnızca depo değiştiğinde yedekleyin. Uygulanması çok zor olabilir, örneğin, nesnelerin listesi ve akılda paket dosyaları olması, yapılandırma ve kancaların sağlama toplamları vb.

6. Sıcak Kopyalama

Devam eden işlemlerin veri bozulması nedeniyle dosya yedeklemeleri etkin depolarla yapılamaz. Bir sıcak kopya, yedekleme amacıyla etkin bir deponun sabit bir durumunu sağlar. Devam eden taahhütler bu kopyayı etkilemez. Yukarıda listelendiği gibi git'in klonlama ve paket işlevleri bunu desteklemektedir, ancak "% 100 yönetici" yedeklemesi için ek komutlar aracılığıyla bazı şeylerin yapılması gerekir.

"% 100 admin" etkin kopya yedekleme

  • Seçenek 1: git bundle --allİçeriğin tam / artımlı döküm dosyalarını oluşturmak ve yapılandırma dosyalarını ayrı ayrı kopyalamak / yedeklemek için kullanın.
  • Seçenek 2: git clone --mirrorKonfigürasyonu ayrı olarak kullanın , işleyin ve kopyalayın, sonra aynanın tam dosya yedeklemesini yapın.
    • Notlar:
    • Bir ayna, yaratımdaki mevcut git şablonuyla doldurulmuş yeni bir havuzdur.
    • Yapılandırma dosyalarını ve dizinleri temizleyin, ardından yapılandırma dosyalarını orijinal kaynak havuzundan kopyalayın.
    • Yedekleme betiği aynada dosya izinleri gibi işletim sistemi yapılandırmasını da uygulayabilir.
    • Sabit bağlantıları destekleyen bir dosya sistemi kullanın ve yedekleme sırasında hız kazanmak ve alan tüketimini azaltmak için aynayı kaynak havuzla aynı dosya sisteminde oluşturun.

7. Geri yükleme

  • Hedef makineye git yapılandırmasını ve en son "yapmanın yolu" felsefesini kontrol edin ve benimseyin.
  • Makineyi ve en son "yapmanın yolu" felsefesini hedeflemek için işletim sistemi yapılandırmasını kontrol edin ve benimseyin.

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

bu bir yedekleme oluşturur ve kurulumu yapar, böylece yedeklemenizi güncellemek için bir git push yapabilirsiniz, muhtemelen ne yapmak istiyorsunuz? Sadece / path / to / backupdir ve / path / to / repo dosyalarının en azından farklı sabit diskler olduğundan emin olun, aksi takdirde bunu yapmak pek mantıklı değildir.


Sanırım klon komutunu iyi biliyor, eğer böyle bir soru sorabilirse ve açıkça onun için yeterli değil (çünkü bir klon ve dökümü değil). Çöplükler basit kopyalar gibi farklı şeylerdir, örneğin: 1) normal çalışma için optimal (veya hatta yetenekli) olmaları gerekmez 2) ancak veri bozulmasına karşı iyi bir dirence ve tamir edilebilirliğe sahip olmaları gerekir 3) Genellikle yararlıdır kopyalar için bir hedef olmasa da, artımlı yedeklemeler için kolayca fark edilebiliyorsa.
peterh - Monica

0

İşte iki seçenek:

  1. Sunucuda repo'nın tüm çıplak içeriğine sahip olduğu için doğrudan git repo dizininin katranını alabilirsiniz . Birinin yedek alırken repo üzerinde çalışıyor olabileceği konusunda ufak bir olasılık var.

  2. Aşağıdaki komut size reppo klonunu verir (tıpkı sunucuda olduğu gibi), o zaman herhangi bir sorun olmadan klonladığınız yerin bir katranını alabilirsiniz.

    git clone --bare {your backup local repo} {new location where you want to clone}
    

Sanırım böyle bir soru sorabilirse klon veya katran komutunu iyi biliyor ve onun için açıkça yeterli değil (çünkü bir klon ve bir çöplük değil). Çöplükler basit kopyalar gibi farklı şeylerdir, örneğin: 1) normal çalışma için optimal (veya hatta yetenekli) olmaları gerekmez 2) ancak veri bozulmasına karşı iyi bir dirence ve tamir edilebilirliğe sahip olmaları gerekir 3) Genellikle yararlıdır kopyalar için bir hedef olmasa da, artımlı yedeklemeler için kolayca fark edilebiliyorsa.
peterh - Monica

3
peterh, Kesinlikle katran veya klon komutu istemiyordu. Eğer yakından bakarsanız, ben de bu komutu açıklamıyordum. Açıklamaya çalıştığım, linux komutlarını öğrettiğim anlamına gelmeyen çeşitli Linux komutlarını içerebilen farklı bir yöntemle Git yedeklemesi. Buraya birkaç fikir koymaya çalışıyorum.
vishal sahasrabuddhe

0

Github'da ise, bitbucket'e gidin ve github deponuzu özel bir repo olarak içe aktarmak için "depoyu içe aktar" yöntemini kullanın.

Bitbucket içindeyse, tersini yap.

Bu tam bir yedek, ancak benim ideal yöntemim olan bulutta kalıyor.


-7

Bildiğim kadarıyla sadece repo içinde olduğu dizinin bir kopyasını yapabilirsiniz, bu kadar!

cp -r project project-backup

Lütfen bunu onaylayan var mı? Bunun doğru bir yedekleme yapmak için doğru yaklaşım olduğunu düşünüyorum.
Ravindranath Akila

5
Kopyalama işlemi sırasında değişikliklerin depoya işlenmesi / aktarılması sırasında tutarsız bir anlık görüntü elde edebileceğinizi düşünüyorum. Git komutları gibi kullanmak git clone --baresize tutarlı bir anlık görüntü verecektir.
Eelke

1
Sunil ile aynı fikirde - bu atomik görünmüyor.
jia103

1
@ jia103 Atomik değilse her zaman bir sorun değildir - sadece üzerinde çalışırken kimsenin repoya ulaşamayacağını garanti etmek için bilmeniz ve yapabilmeniz gerekir. Ama bence OP belirli bir görev istiyor, git depoları için optimize edilmiş bir araç için, basit dosya kopyalama muhtemelen onun için iyi biliniyor.
peterh - Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.