2012-06-19 19 views
9

Git-svn kullanarak svn izlenen dallarının birleştirilmesi için doğru iş akışı nedir. Ben hakkında biraz okudum git-svn yapılandırma anahtarının svn.pushmergeinfo ve uyarılar şunlardır:svn.pushmergeinfo kullanılarak birleştirme için git-svn iş akışı

http://www.kernel.org/pub/software/scm/git/docs/git-svn.html Gönderen:

yapılandırma tuşu: budala neden olacaktır Bu seçenek

svn.pushmergeinfo için -svn, mümkün olduğunda otomatik olarak svn: mergeinfo özelliğini SVN deposunda doldurmaya çalışır. Halihazırda, bu sadece hızlı ileriye doğru birleştirmeyi, tüm ebeveynlerin ancak ilk 'un zaten SVN'ye aktarıldığı durumlarda yapılabilir.

Yani benim normal iş akışı:

Ben Sonra

# Ensure git-svn is configured to populate svn:mergeinfo 
git config --global svn.pushmergeinfo true 

# Update my local svn remotes state 
git svn fetch 

# Track a local branch against a remote SVN backed ^/branches/feature_branch 
git checkout -b local_feature_branch remotes/feature_branch 

# Modify files and commit to local git repo 
git commit -a -m "changes" 
# Push changes to SVN branch ^/branches/feature_branch 
git svn dcommit 

benim local_feature_branch içine ^/gövdesini yukarı birleştirmek üzere bir SVN şube ^/şube/feature_branch ben böyle bir şey yapmak farz var varsayarsak ?

# Sync to the latest SVN 
git svn fetch 
# Rebase "master" which is tracking the remote SVN ^/trunk 
git checkout master 
git svn rebase 

# Checkout the local_feature_branch 
git checkout local_feature_branch 

# Merge "master" into "local_feature" which is tracking ^/trunk 
git merge --squash master 
git commit -m "merge master which is tracking SVN ^/trunk" 

# Dry run the dcommit to SVN which should include svn:mergeinfo property changes 
git svn dcommit --dry-run 

# Commit merge to trunk 
git svn dcommit 
+1

Makul görünüyor. Ne hakkında soru nedir? –

cevap

19

ve svn.pushmergeinfo birlikte çok mantıklı değil --squash birleştirme kullanma. Birleştirme --sash ile, sonuçtaki taahhüt birleştirme işlemi olmayacaktır, bu nedenle sonraki dcommit herhangi bir mergeinfo oluşturmaz.

Stackoverflow'un --squash'ı önerdiğini (çoğunlukla daha eski) iş parçacığı olduğunu biliyorum, ancak bunun büyük ölçüde geçmişin kalıntısı olduğunu düşünüyorum. Bir sene yakın bir süre için firmamızın svn reposlarını yönetmek için git-svn kullanıyorum ve şu ana kadar şu iş akışıyla harika çalıştı:

Her zaman güncel olduğum bir birleşmeden önce emin oluyorum ve sadece ben herhangi bir yerel Senkronize kaydedilmesini olmadığını, güvenli olması için:

# On local_feature_branch 
# Update from SVN 
git svn fetch && git svn rebase -l 

# push pending commits 
git svn dcommit 

Sonra bir 'gerçek' kaynağı olarak "uzak" svn şube kullanarak, birleştirme yoktur. Bu şube ve güncellenmesi anahtarlama kaydeder ve gelen şube herhangi bir yerel Senkronize kaydedilmesini yok olmasını sağlar: Ayrıca

# Create a real, non-forward merge commit 
git merge --no-ff svn/trunk 

# ... and push it to SVN, including mergeinfo 
git svn dcommit 

, birleştirme düzgün yerel tarihe alır bu şekilde, yani sonradan birleştirmeleri olmaz Önceden çözülen çatışmalarla başa çıkmak için. --squash ile her birleşimde olanları yeniden sayın. Bununla birlikte, local_feature_branch öğesinden gövdeye (ör. Svn-konuşan bir reintegrate) geri dönerken birleştirme ile ilgili açık bir sorun olduğuna dikkat edin (Git-SVN with svn.pushmergeinfo: how to avoid self-referencing mergeinfo lines.). Bu bizim repolarımızda nadiren meydana geldi, ama şu ana kadar benim için sorun çıkmadı.

+0

Özellik dalını gövdeye bağlarken kendinden referanslı mergeinfo'dan kaçınmanın detayları var mı? – Dougnukem

+0

Hayır, bugüne kadar sorunu hiç dikkate almadan görmezden geldim. Bazı svn istemcilerinin bununla ilgili bir sorunu olup olmadığından emin değiliz, ancak şu ana kadar git-svn, komut satırı svn veya Eclipse Subversive ile ilgili herhangi bir sorun yaşamadık (ve Tortoise SVN'yi de düşünüyorum) – Carsten

+0

** EDIT ** [Link] 'de ayrıntılı açıklamayı tekrar okuyarak (http://thread.gmane.org/gmane.comp.version-control.git/191932), bu muhtemelen hiçbir zaman bize çarpmadı çünkü biz o zaman içinde gerçekleşen tüm (nadir) reintegrasyon birleşmelerini yaptık. – Carsten