Git:如何将KDiff3配置为合并工具和差异工具

时间:2015-10-23 17:46:33

标签: git git-merge kdiff3 mergetool

最近我使用的是GitExtension 2.46,但具有相同功能的Git版本是1.9.4.msysgit.2。我只想使用Git命令,我卸载了GitExtension并安装了GitKDiff3的最新版本。

当我进行合并并发生冲突时,我运行以下命令:

$ git mergetool

然后我收到消息:

  

合并工具kdiff3不能用作' kdiff3'。

我想它必须是KDiff3路径。

环境

  • 操作系统:Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98(64位)

问题:

  • 我需要在.gitconfig文件中为命令$ git mergetool配置什么才能打开版本为 LOCAL 的KDiff3 GUI, REMOTE 冲突文件的 BASE MERGED

  • 如何配置它使用diff-tool?

8 个答案:

答案 0 :(得分:317)

这些网站非常有用,差不多是mergetooldifftool。我使用了全局配置,但可以在没有问题的情况下由存储库使用。您只需执行以下命令:

git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add difftool.kdiff3.trustExitCode false

使用 trustExitCode 选项取决于您在diff工具返回时要执行的操作。来自documentation

  

git-difftool 分别在每个文件上调用diff工具。默认情况下会忽略diff工具报告的错误。当调用的diff工具返回非零退出代码时,使用 - trust-exit-code 使 git-difftool 退出。

答案 1 :(得分:44)

只是为了扩展the @Joseph's answer

应用这些命令后,您的全局gg <- gg + guides(size = guide_legend(override.aes = list(stroke = 0.5))) gg 文件将包含以下行(以加快您可以在文件中复制它们的过程)

.gitconfig

答案 2 :(得分:19)

对于Mac用户

这是@Joseph接受的答案,但是Mac安装路径的默认位置为kdiff3

(请注意,您可以复制并粘贴并一次性运行它)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false

答案 3 :(得分:10)

嗯,问题是Git在%PATH%中找不到KDiff3。

在典型的Unix安装中,所有可执行文件都驻留在几个众所周知的位置(/bin//usr/bin//usr/local/bin/等),并且可以通过简单地键入它来调用程序shell处理器中的名称(例如cmd.exe :))。

在Microsoft Windows中,程序通常安装在专用路径中,因此您无法在kdiff3会话中键入cmd并运行KDiff3。

硬解决方案:你应该通过指定kdiff3.exe的完整路径告诉Git在哪里找到KDiff3。不幸的是,Git不喜欢其配置中的路径规范中的空格,所以我最后一次需要它时,我最终得到了那些古老的“C:\ Progra~1 ... \ kdiff3.exe”,好像它已经晚了20世纪90年代:)

简单的解决方案:编辑您的计算机设置,并在%PATH%中包含kdiff3.exe的目录。然后测试您是否可以通过名称从cmd.exe调用它,然后运行Git。

答案 4 :(得分:5)

要修改kris'answer,从Git 2.20(2018年第四季度)开始,对git mergetool的正确命令应为

git config --global merge.guitool kdiff3 

这是因为“ git mergetool”学会了采用“ --[no-]gui”选项,就像 “ git difftool”。

请参见commit c217b93commit 57ba181commit 063f2bdDenton Liu (Denton-L)(2018年10月24日)。
(由Junio C Hamano -- gitster --commit 87c15d1中合并,2018年10月30日)

  

mergetool:接受-g/--[no-]gui作为参数

     

按照difftool接受-g/--[no-]gui选项的方式,使mergetool接受相同的选项,以便使用merge.guitool变量查找默认的mergetool而不是{ {1}}。

答案 5 :(得分:4)

我需要添加命令行参数,否则KDiff3将仅在没有文件的情况下打开,并提示我输入基本,本地和远程信息。我使用了TortoiseHg随附的版本。

此外,我还需要使用旧的DOS 8.3文件名。

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

但是,它现在可以正常工作。

答案 6 :(得分:1)

(当试图从WSL git中找到如何使用kdiff3时,我在这里结束并获得了最后的文章,所以我将为其他也在其中寻找答案的人绊倒我的解决方案)

如何将kdiff3用作WSL git的差异/合并工具

使用Windows 10上安装的kdiff3作为WSL中git的差异/合并工具的步骤:

  1. 将kdiff3安装目录添加到Windows路径。
  2. 将TMP添加到WSLENV Windows环境变量(WSLENV = TMP / up)。 git将把TMP目录用于临时文件,例如文件的先前版本,因此该路径必须在Windows文件系统上才能起作用。
  3. 在.bashrc中将TMPDIR设置为TMP:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. 调用kdiff3时,将unix-path转换为Windows-path。我的.gitconfig样本:
[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    #path = kdiff3.exe
    # Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
    cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false

答案 7 :(得分:-1)

我刚刚在loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { circProgressBar.setVisibility(View.VISIBLE); final String emailUser = emailEditText.getText().toString(); final String passwordUser = passwordEditText.getText().toString(); firebaseAuth.signInWithEmailAndPassword(emailUser, passwordUser) .addOnCompleteListener(EatCornLoginActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "createUserWithEmail:success"); FirebaseUser user = mAuth.getCurrentUser(); DatabaseReference client_db = FirebaseDatabase.getInstance().getReference().child("Clients") .child("Eater") .child(user.getUid()); client_db.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (snapshot.exists()) { // go to eater activity }else{ //go to vendor activity } } @Override public void onCancelled(FirebaseError firebaseError) { Toast.makeText(getContext(), firebaseError.getMessage(), Toast.LENGTH_SHORT).show(); } }); } else { // If sign in fails, display a message to the user. Log.w(TAG, "createUserWithEmail:failure", task.getException()); Toast.makeText(EmailPasswordActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... } }); 目录中安装了KDiff3.exe,它解决了我的问题。