Git trên Windows: Làm thế nào để bạn thiết lập một mergetool?


346

Tôi đã thử msysGit và Git trên Cygwin. Cả hai đều hoạt động tốt và bản thân họ và cả chạy gitk và git-gui một cách hoàn hảo.

Bây giờ làm thế nào để tôi cấu hình một mergetool? (Vimdiff hoạt động trên Cygwin, nhưng tốt nhất là tôi muốn thứ gì đó thân thiện hơn với người dùng đối với một số đồng nghiệp yêu thích Windows của chúng tôi.)



4
Phần mở rộng Git có giao diện người dùng git có một công cụ hợp nhất, thân thiện với người dùng windows.
KallDrexx

Hình như bạn cần TortoiseGit?
Sergei

Câu trả lời:


304

Để theo dõi câu trả lời của Charles Bailey, đây là thiết lập git của tôi sử dụng p4merge (công cụ hợp nhất 3 đường đa nền tảng miễn phí); đã thử nghiệm trên cài đặt msys Git (Windows):

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

hoặc, từ trình bao windows cmd.exe, dòng thứ hai trở thành:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Những thay đổi (liên quan đến Charles Bailey):

  • được thêm vào cấu hình git toàn cầu, nghĩa là hợp lệ cho tất cả các dự án git không chỉ là dự án hiện tại
  • giá trị cấu hình công cụ tùy chỉnh nằm trong "mergetool. [tool] .cmd", không phải "merge. [tool] .cmd" (ngớ ngẩn với tôi, đã dành một giờ khắc phục sự cố tại sao git cứ phàn nàn về công cụ không tồn tại)
  • đã thêm dấu ngoặc kép cho tất cả các tên tệp để các tệp có khoảng trắng vẫn có thể được tìm thấy bằng công cụ hợp nhất (Tôi đã thử nghiệm điều này trong msys Git từ Powershell)
  • lưu ý rằng theo mặc định, Perforce sẽ thêm thư mục cài đặt của nó vào PATH, do đó không cần chỉ định đường dẫn đầy đủ đến p4merge trong lệnh

Tải xuống: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (tháng 2 năm 2014)

Như @Gregory Pakosz đã chỉ ra , msys git mới nhất hiện nay "thực sự" hỗ trợ p4merge (được thử nghiệm trên 1.8.5.2.msysgit.0 ).

Bạn có thể hiển thị danh sách các công cụ được hỗ trợ bằng cách chạy:

git mergetool --tool-help

Bạn sẽ thấy p4merge trong danh sách có sẵn hoặc hợp lệ . Nếu không, xin vui lòng cập nhật git của bạn.

Nếu p4merge được liệt kê là có sẵn , nó nằm trong PATH của bạn và bạn chỉ phải đặt merge.tool :

git config --global merge.tool p4merge

Nếu nó được liệt kê như là hợp lệ , bạn phải xác định mergetool.p4merge.path ngoài merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Trên đây là đường dẫn ví dụ khi p4merge được cài đặt cho người dùng hiện tại, không phải toàn hệ thống (không cần quyền quản trị hoặc độ cao UAC)
  • Mặc dù ~nên mở rộng sang thư mục chính của người dùng hiện tại (vì vậy theo lý thuyết thì đường dẫn phải như vậy ~/AppData/Local/Perforce/p4merge.exe), nhưng điều này không hiệu quả với tôi
  • Thậm chí tốt hơn là tận dụng biến môi trường (ví dụ $LOCALAPPDATA/Perforce/p4merge.exe), git dường như không mở rộng biến môi trường cho đường dẫn (nếu bạn biết cách làm việc này, vui lòng cho tôi biết hoặc cập nhật câu trả lời này)

Hmm - thử cái này - cấu hình đầu tiên hoạt động tốt, tiếp theo chỉ hiển thị văn bản trợ giúp cho git config. Không chắc chắn lý do tại sao.
Daniel Staple

1
Có nó - những trích dẫn duy nhất trông nghi ngờ với tôi. Chỉ cần tăng gấp đôi điều này và họ làm việc.
Daniel Staple

13
thiết lập mergetool.p4merge.cmdsẽ không hoạt động nữa vì Git đã bắt đầu cố gắng hỗ trợ p4merge, xem libexec/git-core/git-mergetool--lib. thay vào đó, nó sử dụng trực tiếpmergetool.p4merge.path
Gregory Pakosz

5
Phải đặt con đường đầy đủ và thoát khỏi dấu ngoặc kép:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty

21
Điều này đã làm điều đó cho tôi: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'trên máy Windows 7
Dan P.

88

thiết lập mergetool.p4merge.cmd sẽ không hoạt động nữa vì Git đã bắt đầu cố gắng hỗ trợ p4merge, xem libexec / git-core / git-mergetool--lib.so chúng ta chỉ cần chỉ định đường dẫn mergetool cho git, ví dụ như p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Sau đó, nó sẽ làm việc.


1
Hoạt động với Beyond So sánh 3 là tốt. Chỉ cần sử dụng đường dẫn đến BComp.exe thay thế. Cảm ơn!
Richard Anthony Hein

4
Tôi nhận ra đây là một chủ đề cũ, nhưng tôi không thể làm cho con đường đó hoạt động được. Tôi hơi bối rối về cách đường dẫn được cho là thoát được khi có sự tương tác của cmd / msys ... EDIT Chuyển sang dấu ngoặc kép đã sửa nó!
Rustavore

Cảm ơn bạn Gitninja! Lưu ý rằng bạn có thể nhập mã này vào Git Bash, nhưng nếu bạn sử dụng lệnh Nhắc, bạn phải thay đổi trích dẫn đơn thành trích dẫn kép
Hải Phong

61

Tôi đang sử dụng Portable Git trên WinXP (hoạt động một điều trị!) Và cần thiết để giải quyết xung đột nảy sinh trong việc phân nhánh. Trong tất cả các gui tôi đã kiểm tra, KDiff3 tỏ ra minh bạch nhất khi sử dụng.

Nhưng tôi đã tìm thấy các hướng dẫn tôi cần để làm cho nó hoạt động trong Windows trong bài đăng trên blog này , các hướng dẫn hơi khác so với các phương pháp khác được liệt kê ở đây. Về cơ bản, số tiền này đã thêm các dòng này vào .gitconfigtệp của tôi :

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Làm việc tốt bây giờ!


13
trên PC Win7 của tôi, tôi đã phải sử dụng path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(chú ý dấu gạch chéo ngược)
Ai đó ở đâu đó

Tôi đã gặp một lỗi như thế này "Công cụ tìm khác biệt không khả dụng dưới dạng 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork

Bạn có biết nếu có sự khác biệt với thứ tự mà mỗi phần được thêm vào. Ý tôi là, nếu [merge] sẽ là sau [mergetool]?
Samuel

20

Theo Cygwin, điều duy nhất làm việc cho tôi là như sau:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

Ngoài ra, tôi muốn tắt thông báo nhắc nhở cho Difftool:

git config --global difftool.prompt false

16

git mergetool có thể cấu hình đầy đủ để bạn có thể chọn công cụ yêu thích của mình.

Tài liệu đầy đủ có tại đây: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Tóm lại, bạn có thể đặt một mergetool mặc định bằng cách đặt biến cấu hình người dùng merge.tool.

Nếu công cụ hợp nhất là một trong những công cụ được hỗ trợ bởi nó, bạn chỉ cần đặt thành mergetool.<tool>.pathđường dẫn đầy đủ đến công cụ (thay thế <tool>bằng những gì bạn đã cấu hìnhmerge.tool .

Mặt khác, bạn có thể thiết lập mergetool.<tool>.cmdmột chút shell để được đánh giá trong thời gian chạy với các biến shell $BASE, $LOCAL, $REMOTE, $MERGEDđược đặt thành các tệp thích hợp. Bạn phải cẩn thận một chút với việc thoát cho dù bạn trực tiếp chỉnh sửa tệp cấu hình hay đặt biến bằng git configlệnh.

Một cái gì đó như thế này sẽ mang lại hương vị của những gì bạn có thể làm ('mymerge' là một công cụ hư cấu).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Khi bạn đã thiết lập công cụ hợp nhất yêu thích của mình, đó chỉ là vấn đề chạy git mergetoolbất cứ khi nào bạn có xung đột để giải quyết.

Công cụ p4merge từ Perforce là một công cụ hợp nhất độc lập khá tốt.


8

Để so sánh trên Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

2
Tôi đã sử dụng các lệnh này nhưng tôi đang sử dụng WinMerge thay vì Beyond So sánh.
Brent Keller

6

Có vẻ như các phiên bản git mới hơn hỗ trợ trực tiếp p4merge, vì vậy

git config --global merge.tool p4merge

nên là tất cả những gì bạn cần, nếu p4merge.exe nằm trên đường dẫn của bạn. Không cần thiết lập cmd hoặc đường dẫn.


Đây là chìa khóa. Sau khi cài đặt p4merge và đặt mergetool.p4merge.path đến vị trí chính xác, nó vẫn không hoạt động. Thêm thư mục cài đặt vào đường dẫn đã làm việc.
RichardM

5

Như đã trả lời ở đây (và ở đâyở đây ), mergetool là lệnh để cấu hình này. Đối với một frontend đồ họa đẹp, tôi khuyên bạn nên kdiff3 (GPL).


4

Tôi đã phải bỏ phần trích dẫn thêm bằng msysGit trên windows 7, không biết tại sao.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

3

Nếu bạn đang làm điều này thông qua cygwin, bạn có thể cần phải sử dụng cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

3

Bah, điều này cuối cùng đã làm việc cho tôi (Windows 7 + Cygwin + TortoiseMerge):

Trong .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

Nhờ áp phích trước cho mẹo sử dụng cygpath!


3

tôi sử dụng một ứng dụng có tên WinMerge ( http://winmerge.org/ ) thông tin từ hướng dẫn của họ ( http://manual.winmerge.org/CommandLine.html )

đây là tập lệnh bash tôi sử dụng từ mergetoolchỉ thị thông qua.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

về cơ bản, bash chiếm khi kết quả của diff trong một tệp trống và tạo một tệp tạm thời mới ở đúng vị trí.


3

Tôi đã tìm thấy hai cách để định cấu hình " SourceGear DiffMerge " là Difftool và mergetool trong github Windows.

Các lệnh sau trong cửa sổ Dấu nhắc Lệnh sẽ cập nhật .gitconfig của bạn để định cấu hình GIT sử dụng DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ HOẶC ]

Thêm các dòng sau vào .gitconfig của bạn. Tệp này phải có trong thư mục chính của bạn trong C: \ Users \ UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

1

Bạn cũng có thể muốn thêm các tùy chọn này:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

Ngoài ra, tôi không biết tại sao nhưng trích dẫn và gạch chéo từ câu trả lời của Milan Gardian đã làm tôi khó chịu.


1

Nếu bất cứ ai muốn sử dụng gvim làm công cụ tìm khác biệt của họ trên TortoiseGit, thì đây là những gì bạn cần nhập vào văn bản nhập cho đường dẫn đến công cụ tìm khác biệt bên ngoài:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

1

Đối với cấu hình git mergetool 3 chiều của IntelliJ IDEA (Phiên bản cộng đồng) trong môi trường Windows ( ~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh là để chuyển đổi đường dẫn sang Windows trên msys và được lấy từ câu hỏi chuyển đổi đường dẫn msys trên stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 


0

Nếu bạn gặp sự cố khi mở p4merge từ SourceTree, hãy tìm tệp cấu hình cục bộ có tên config trong MyRepo.git và xóa mọi cấu hình hợp nhất. Trong trường hợp của tôi, nó đã cố mở Meld mà tôi vừa gỡ cài đặt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.