Git'i merkezi depo olarak kullanma


12

Git'i kendi kullanımım için ayarladım - böylece bir projeye 'herhangi bir yerden' erişebilirim ve buradaki X ve burada Y bölümlerinde çalışıyorsam sürüm güvenliğini koruyabilirim ve gerekirse birleştirebilirim.

Ancak, geliştirme makinelerimden yalnızca birinin statik IP'si var. Beynim CVS modunda sıkıştı, bu yüzden git, bu makineyi diğerlerinin çektiği 'merkezi' sunucu olacak şekilde ayarlamaya çalıştım.

Bu tür işler. 'Master' M'den git-pull yapan bir grup AC makinem var. Git veriyi geri göndermek için iter.

Usta üzerinde geliştirme yaparsam sorun gelir. İlk olarak, en son sürümü yapmadan merkezi repoyu nasıl alacağımı anlayamıyorum

git reset --hard HEAD

bu biraz aşırı görünüyor. Sıfırlamadan önce merkezi makinede geliştirme yaparsam, daha önce itilmiş olan değişikliklerle nasıl birleştirileceğinden emin değilim.

Zihinsel modelimle ilgili bir şey çok uzakta. Yardım?


"Master" dediğinizde, ana depodan mı yoksa ana daldan mı bahsediyorsunuz?
innaM

master deposu
Alex Feinman

1
git bağlamındaki "master" genellikle varsayılan dalın adıdır.
innaM

bu muhtemelen SO
Ken Liu

Yanıtlar:


30

Merkezi deponuzun çıplak olmasını istiyorsunuz. Üzerinde yaşadığı makinenin ismini söyle static:

$ ssh static git init --bare /git/myproject.git

Bu çıplak depo, merkezi bir buluşma noktasıdır: gelişime değil itmeye ve çekmeye yöneliktir.

Gelişiminizi merkezi deponun klonlarında yapın:

$ cd ~/src
$ git clone static:/git/myproject.git

Çalışsanız bile static, bir klonda çalışın:

$ git clone /git/myproject.git

Bu depo üzerinde çalışan tek kişi siz olsanız da, git belgelerinin konu dallarına ne dediği üzerinde çalışmayı alışkanlık haline getirin . Bunun acil bir yararı, temiz bir ana verileri tutmasıdır , yani merkezi ana dalınızdan her zaman birleştirme olmadan mevcut yerel havuzunuzun efendisine çekebilirsiniz.

Örneğin:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

Bu büyük bir anlaşma gibi görünmeyebilir, ancak projeyi o dalda temsil edildiği gibi kısmen pişmiş bir durumda bırakma özgürlüğü verir veya havalı fikriniz bir flop olduğu ortaya çıkarsa, o dalı kolayca projenizde zaten diğer dallarda çalışan başka bir şeyi kırmak. Sonsuz ücretsiz mulliga!

Belki o gece eve gidip yeni bir özellik eklediniz. Ertesi sabah sen

$ git checkout master
$ git pull

yerel yöneticinizi merkezi depodaki bilgileri yansıtacak şekilde güncellemek için.

Ancak şimdi foo hatasını düzelttiğinizi ve ana dalınıza eklemeye hazır olduğunuzu varsayalım. İlk önce dün geceki değişikliklerle entegre etmek istiyorsunuz:

$ git checkout fix-bug-in-foo
$ git rebase master

rebaseGeçen geceki yeni özellikle üstünde foo hata düzeltildi sanki komutu depo görünmesini sağlar. (Bu biraz benzer svn update, ancak daha esnek ve güçlü.)

Şimdi merkezi ustanıza almak için:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

Efendiye özel muamele ettik, ama bu sadece geleneksel. Git deposunu kullanarak farklı depoların farklı dallarındaki çalışmaları kolayca paylaşabilirsiniz static.


1
Müthiş bir cevap, eldeki tüm sorunları çivi.
Dan Loewenherz

Benim git install gitbiti (eski sürüm ??) için bir seçenek olarak --bare kabul etmiyor, ama - mevcut kimi repo klonlama ve sonra yapılandırma dosyalarını elle biraz düzenleyerek etrafında çalıştı.
Alex Feinman

Git 1.6.4.x çalıştırıyorsanız, git init --barebaşka argüman olmadan. Geçerli çalışma dizinini veya ayarlanmışsa GIT_DIR ortam ayarını kullanır. Bir dizin argümanı alabilmesi için git 1.6.5.x'e ihtiyacınız olduğuna inanıyorum.
Darren Hall

4
Yaptığım iş için şimdiye kadar gördüğüm en iyi git iş akışı açıklaması.
Greg Graham

8

Merkezi git deposuna sahip bir merkezi sunucunuz varsa , bu havuz bir barehavuz olmalıdır . Çıplak depoların içindeki dosyaların çalışan kopyaları yoktur. Sonuç olarak, bu merkezi makine üzerinde çalışıyorsanız, doğrudan merkezi depoyla değil, yerel bir klonla çalışıyorsunuzdur.


6

Bu cevap, gbacon'un cevabına benzer , ancak zaten yerel bir repo kurulumuna sahip olduğunuz ve merkezi bir repo olarak kabul edilen bir uzak ana oluşturmak istediğiniz bir yaklaşım alır. Sadece farklı bir yaklaşımdan detaylar ekliyor.

Dot-config dosyalarımı depolamak için git kullanıyorum. Bir 'merkezi repo' olarak düşündüğüm şeyden itiyorum ve çekiyorum. Tüm nokta dosyalarımı birden çok bilgisayar üzerinden sıfırlamak oldukça uygun.

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

Bu, repo sitesinde boş bir çıplak repo yarattı.

Şimdi zaten yerel olarak mevcut bir repo'm varsa, bunu uzak siteye gönderebilirim.

$ cd ~/src/dotconf

chdir'i yerel dizine ekleyin.

$ git remote add origin ssh://example.com/~/dotconf.git

Uzak repoyu başlangıç ​​noktası olarak ekleyin, böylece itme / çekme bu repoya etki eder.

$ git push origin master

Efendimi başlangıç ​​noktasına doğru it (daha önce git uzaktan kumandasıyla etiketlendiğinde). Şimdi bu uzak repo benim 'merkezi repo'm gibi değerlendiriliyor. Tüm git push / pull'um orijin ile etkileşime girecek.

Başka bir ev sahibine gidersem, yeni bir yere repo yapan klondan kolayca çekebilirim.

$ git clone ssh://example.com/~/dotconf.git

Uzak sunucuda geliştirme yapmak istersem, önce klonlayıp sonra çıplak repoya geri iterim.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

Büyük olasılıkla sizin ayarlamak gerekir git config --add branch.master.remote originböylece git pullbelirli yeterince olmuyorsun şikayetçi değil. Diğer alternatif, ana dalınızı --trackuzaktaki kaynağa ayarlamaktır. Birden fazla şubeniz varsa kullanışlıdır.


1

Aynı sorunu bugün araştırıyordum. Bu blog yazısında konu hakkında çok fazla tartışma var, ancak çoğunluk düşüncesi Manni'nin söylediklerini yapmak. Diğer bazı olasılıklar için David French'in gönderime yaptığı bir yoruma bakın, sonuçta dizinde veya çalışma ağacında taahhüt edilmemiş çalışmalara sahip bir depoya yanlışlıkla itmeniz durumunda ne yapmanız gerekir. "git reset –soft HEAD ^", yaptığınız değişikliği işinizi bozmadan geri alır.


2
Bu blog gönderisiyle ilgili bir sorun, dizinin yararlılığını atlamaktır. Burada git yerine nasıl çalışılacağını açıklamak için iyi bir makale var - osteele.com/archives/2008/05/my-git-workflow - iş akışı diyagramları dahildir.
Darren Hall
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.