2015-10-01 16 views
11

Eski SVN deposu, tüm dalların/etiketlerin tüm doğru yerlere ulaşmaya çalışılmasını içeren Git'e dönüştürülmesi sürecindeyim. Bu bölüm gayet iyi gidiyor, ama benim senaryoda tarihte bir taahhüt eklemek istediğim zamanlar var ki, daha sonra bir sonraki taahhütle squash etmek istiyorum. Sorun şu ki, taahhütleri tek tek ele almıyorum, ama büyük bir grup olarak, onları SVN deposundan çıkarırken onları ezemem. Sonunda, benim depo şöyle görünür:Squash iki Git interaktif rebase olmadan tarihin ortasında taahhüt eder

* (branch_2, HEAD) commit 5 
* commit 4 
* commit 3 
* SQUASH ME! 
* (branch_1) commit 2 
* commit 1 

Ben interaktif rebase ile Açıkçası kolay, ancak bir komut dosyası içinde daha zorlu olan SQUASH ME! ile commit 3 ezmeye isterler. Ben var gibi ana sorun branch_1 ya da herhangi bir işlemden önce ödeme için kolay, o zaman sonra işlemek için sormak zor ve branch_2 geri gitmek için ne kadar taahhütler tahmin etmek benim için zor . Ben gerçekten şu gibi bir şey yapabilmek istiyorum:

git checkout branch_1+2 

Herhangi bir işaretçi? kabak taahhüt düzeltme BAŞ taahhüt mesajı kullanır oysa, etkileşimli msj taahhüt soracaktır çünkü

+0

(komut dosyaları için harika) interaktif olmak zorunda kalmadan ezmek gibi şeyler yapmak için Rebase komutu için seçenek "üzerine" bir göz atın .pivotal.io/labs/labs/git-rebase-onto –

+0

@ Jonathan.Brink Tam olarak aradığım şey bu değil. Bu yazı, taahhütleri düşürebilmeyi vurgular. Değişiklikleri yapmak istediğim için 'SQUASH ME!' Taahhüdünü ezmek (veya düzeltmek) istiyorum. Sadece onları '3' ile birleştirmelerini istiyorum. –

+0

Komut dosyasının etkileşimli yeniden oluşturma sırasında düzenleyici olarak hareket etmesini sağlamak daha basit olabilir. – coredump

cevap

8

Sen ne konuşuyorsun, bir kabak ama düzeltme değildir.

Burada, müdahalesi olmadan yapan bir betik var.

senaryo:

ce0e2fd (master, HEAD) commit 4 
72ab3c4 commit 3 
8150939 commit 2 
301c1e1 commit 1 

Birlikte birleşecek git fixup 72ab3c4 yapabilirim "taahhüt: geçmişiniz ise /usr/bin/git-fixup

#/bin/bash 
# This command fixesup one commit onto his parent 
set -e 

# We need a commit from the first argument of that command 
commit=${1:?No commit given as first argument} 
startingbranch=$(git rev-parse --abbrev-ref HEAD) 

# Checkout the parent of the asked commit 
git checkout "$commit" 
git checkout HEAD~ 

# Merge the commit into it's parent, keeping the commit message of the parent 
git merge --squash "$commit" 
git add . 
git add --update 
git commit --amend --no-edit 

# Store the current commit 
newcommit=$(git rev-parse HEAD) 

# Rebase the starting branch onto the new commit 
git checkout "$startingbranch" 
git rebase "$newcommit" 

Örneğin

git fixup <commit-id> 

ile kullanın "Commit 2" iletisiyle birlikte "3" ve "commit 2" işlemlerini gerçekleştirin ve Ana dalda tekrar görüşürüz. git rebase --help itibaren

+0

Çalışma dizini kirli olduğunda iptal etmek için 'set -e 'eklemeyi öneririm. İlk 'git checkout', şikayette bulunacak ve komut dosyasının tamamı çıkacaktır. – coredump

+0

Öneri için teşekkürler, ben – edi9999

5

:

günlük mesaj işlemek --autosquash ("! ... fixup" veya) "! ... squash" ile başlar ve orada unvanı aynı ile başlayan bir taahhüt, otomatik olarak rebase -i yapılacaklar listesini değiştirir, böylece işlenecek imzalamadan sonra ezme için işaretlenen taahhüt doğru gelir ve hareket ettirilen işlemin eylemini seçimden değiştir squash (veya fixup).

Bu seçenek sadece - interaktif seçenek kullanıldığında geçerlidir.

Bu, giriş doğru formda ise, istediğinizin yarısını yapacak gibi görünüyor.

Diğer yarısı, etkileşimli düzenleyiciyi başlatmasını engelliyor.Neyse ki, editör yapılandırılabilir, bu yüzden onu zararsız bir şeye atayabiliriz.

bu deneyin:

env EDITOR=true git rebase -i --autosquash <from-here> 

true için editörü (sadece başarılı bir şekilde çıkar bir aracı) ayarlanması otomatik kabak bir şey ayarlanmış olması gereken, ayarları rebase varsayılan devam etmek budala ikna etmeye yeterlidir işe yarar. --autosquash istediğini yapmazsa


Alternatif olarak, istediğiniz herhangi komut dosyasına EDITOR ayarlayabilirsiniz:

env EDITOR=mysquasher.sh git rebase -i <from-here> 

komut ihtiyacınız her şeyi yapabilir, ama sizin durumunuzda o Sadece "SQUASHME!"'u içeren her satırı bulmalı ve "fixup"'u okumak için aşağıdaki satırdaki "pick"'u değiştirmelisiniz. Bu muhtemelen en kolay Awk elde edilebilir: http: // blogda

#!/bin/bash -e 

awk -- 'BEGIN {dosquash=0} 
     dosquash==1 {gsub(/^pick/, "fixup"); dosquash=0} 
     /SQUASHME/ {dosquash=1} 
     {print}' "$1" > /tmp/tmp.$$ 

mv /tmp/tmp.$$ "$1" 
+0

env'yi EDITOR = true hala editörümü benim için çekiyor. – Andrew

+0

VISUAL ayarlandı mı, yoksa başka şüpheli görünen ortam değişkenleri var mı? – ams

+0

söyleyemem. – Andrew

İlgili konular