Tüm şubeleri ve etiketleri içeren tüm bir git deposunu yedeklemenin basit bir yolu var mı?
Tüm şubeleri ve etiketleri içeren tüm bir git deposunu yedeklemenin basit bir yolu var mı?
Yanıtlar:
Sadece bir klon yapmak nedir?
git clone --mirror other/repo.git
Her depo, uzaktan kumandasının bir yedeğidir.
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.
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.
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
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.
git bundleveya git clonealır her şeyi , örneğin kanca komut.
git bundleUzak bir depoya karşı kullanabilir miyim ?
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.
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.
git bundle create reponame.bundle --all?
Her şey .gitdizinde bulunur. Sadece projenizle birlikte herhangi bir dosya gibi yedekleyin.
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).
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.
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
git clone --bare+ için çok iş gibi görünüyor git push --force.
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? )
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:
Sonra onu tipik isteklerle zenginleştirin ve bazı ön ayarları belirtin:
Bakış açısı, "% 100" yedeklemenin ne olduğuna göre değişir. İşte iki tipik.
git bir geliştirici aracı ve üzeri bu bakış açısı desteklemektedir git clone --mirrorve git bundle --all.
git gc)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.
Çoğu yedeklemeler için geneldir.
git gc --auto
git bundle --all
git bundle verify.git clone --mirror
git fsck.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.
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.
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.git clone --mirrorKonfigürasyonu ayrı olarak kullanın , işleyin ve kopyalayın, sonra aynanın tam dosya yedeklemesini yapın.
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.
İşte iki seçenek:
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.
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}
Bildiğim kadarıyla sadece repo içinde olduğu dizinin bir kopyasını yapabilirsiniz, bu kadar!
cp -r project project-backup
git clone --baresize tutarlı bir anlık görüntü verecektir.