2013-03-10 20 views
27

Mergetool GUI'yi her zaman otomatik olarak gösterilecek ve devre dışı bırakacak şekilde nasıl zorlayabilirim? Orada Birleştirme sırasında bir çatışma olduğunu ve mergetool kullandığımda soru üzerine girmek "birleştirme çözünürlük aracını (KDiff3) başlatmak için geri dönüşünü Hit" vur ve hiçbir GUI gösterilir ve sonraMergetool GUI'yi (kdiff3) her zaman gösterilmeye nasıl zorlayabilirim?

Bazen, sadece immediatelly dönmek çakışma çözülmüş gibi görünüyor.

Artık kdiff3'ü mergetool olarak kullanmak üzere yapılandırılmış gitmem gerekiyor, ancak belirtilen birleştirme yöntemi olarak kod eşlemem olduğunda da oldu. Tanımlanmış davranışa teorik olarak neden olan ktiff3'te"Çakışma olmadan birleştirme ve otomatik çakışma olmadan bir seçenek var" olduğunu biliyorum, ancak bu seçeneği her zaman devre dışı bıraktım/işaretlemiyorum.

Ayrıca, doğruya ayarlanmış, ancak yanlış olarak ayarlayın bile GUI gösterilmez git mergetool gitconfig, doğrudan trustExitCode seçeneği yoktur.

Otomatik çözümlemeyi kimin yaptığını bilmiyorum. Bazı ön işleme veya kdiff3 içinde Mergetool?

Windows üzerinde çalışıyorum ve Git uzantılarının yüklü olmasını sağlıyorum. KDiff3 özgü

simillar soru burada da istendi: Kdiff3 won't open with mergetool command

cevap

31

Git sert tüm çatışmalar otomatik çözülebilir KDiff3 tarafından ise yukarı göstermek için değil GUI neden KDiff3 için komut satırı seçeneği olarak kodlanmış --auto sahiptir. Kdiff3 ayarlarında yok saymak için komut satırı seçeneklerini belirtebilirsiniz, ancak oraya --auto'u koyarak benim için çalışmadım.

Çözüm olarak ben birleştirme aracı olarak KDiff3 benim kendi varyantını yapılandırılmış:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\"" 

Bu çok benzer KDiff3 için varsayılan olarak kullanır, ancak --auto bayrağı olmadan neyi git etmek.

Artık, git mergetool -t kdiff3NoAuto numaralı telefonu arayabilir veya global olarak mergetool olarak kdiff3NoAuto'u yapılandırabilir ve kdiff3 her zaman çakışmaların çözümünde görünür.

Güncelleme: Eğer gerçekten çözme herhangi bir otomatik devre dışı bırakmak istiyorsanız, sorunun ikinci kısmını ilişkin, sadece yukarıda kdiff3 komut satırına --qall ekleyin. Ancak, el ile dosyanın tüm değişikliklerini el ile çözmeniz gerekir, hatta git çakışmasıyla sonuçlanmayanlar bile. En iyi senaryo şöyledir: kdiff3, dosyaları nasıl birleştirdiğini ve kullanıcının seçmesi için çakışmaları nasıl açtığını gösterir. Bunu yapmayı herkes bilir mi?

git config merge.kdiff.driver 'kdiff3 "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor" -L2 "Working Copy" --L3 "Version from Other Branch"' 

Sen --global ekleyerek bu sürücü küresel yapabilirsiniz: Bir çatışma, sadece kurulum kdiff ile birleştirme sürücü olduğunda yalnızca denir yerine mergetool yapılandırma

+0

Wauu, bu harika. Teşekkürler! Bağlantılı soruya da cevap vermeyi düşünebilir ya da muhtemelen sonunda muhtemelen aynı problem olduğu için yorum yorumları yazabilirsiniz. –

+0

Teşekkürler. Bu soruya diğer soru ile bağlandım. – PiQuer

+1

Göz ardı edilen komut satırı seçeneğine '--auto' eklenmesi, KDiff3 0.9.98 (64bit) ile çalıştı. Ayarlar menüsü -> KDiff3'ü yapılandır -> Entegrasyon sekmesi. Otomatik çözümlenmiş bilgi iletişim kutusu görünür, ancak daha sonra düzenleme yapılmasına izin veren birleştirme görüntülenir. –

0

. Ama sen repo bir .gitattribute eklemek gerekir:

* merge=kdiff 
0

git mergetool davranışı seçilen birleştirme aracı ve Git ona geçer komut satırında tamamen bağımlıdır.Bu nedenle, davranışını değiştirmek için, istediğiniz şeyi yapan bir komut satırı bulmanız ve bu komut satırını kullanmak için Git'i yapılandırmanız gerekir.

Bu soruyu kendim (özellikle KDiff3 ile ilgili olarak) ve PiQuer's answer bana yoldan ayırdı, ama düşünmemi sağladı. Git'in varsayılan davranışı tam olarak --auto seçeneği dışında KDiff3 için çoğaltmak için bir yol olmalı (KDU3'ün GUI'yi göstermemesine neden olan şey).

Kdiff3 birleştirme aracı için varsayılan komutun kaynağı git/mergetools/kdiff3 dosyasında görünüyor. Bu kabuk senaryosuna benziyor, bu yüzden tam olarak kopyalayabilmeliyiz! , Tek bir satırda o koyarak --auto kaldırma ve şeyler kaçan bize verir bu:

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi" 

base_present ve merge_tool_path değişkenler özellikle bazı mümkündür, böylece mergetool.<tool>.cmd kullanmak için kullanılabilir olarak Git belgelerinde belirtilmeyen Gelecekte bu komutun olduğu gibi çalışmayabilir. Bununla birlikte, BASE'un var olan bir dosyayı ve KDiff3 için sabit kodlanmış bir yolu ifade edip etmediğini test etmek için kolayca bir komutla değiştirilebilirler.

Yukarıdaki komutun, ayrı bir tane oluşturmak yerine Git'in kdiff3 birleştirme aracının varsayılan komutunun yerini aldığını unutmayın. Orijinal Söz konusu diğer noktaları bir çift İlişkin

:

  • trustExitCode ayar birleştirme aracının çıkış kodu birleştirme başarılı olup olmadığını uygun bir gösterge olup olmadığını Git söyler. Birleştirme aracının davranışını etkilemez, daha ziyade birleştirme aracı çıktıktan sonra Git'in davranışı etkilemez. manual for git-mergetool'a bakın.
  • git mergetool yazdıktan sonra gördüğünüz otomatik çözünürlük, birleştirme aracının kendisi tarafından yapılır. git mergetool, yalnızca birleştirilmesi gereken dosya sürümlerindeki dış aracı çağırır.