gpt4 book ai didi

Windows 中的 Git difftool 查看所有更改文件的列表以及文件差异(万花筒)?

转载 作者:IT王子 更新时间:2023-10-29 00:47:56 28 4
gpt4 key购买 nike

当我执行 git difftool 时,Kaleidoscope在左侧边栏中显示所有已更改的文件:


(来源:kaleidoscopeapp.com)

Windows 中是否有任何差异工具可以显示这样的文件列表?

(我不希望该工具在单独的窗口中同时打开所有文件。我正在寻找一个单一的窗口来显示已更改的文件列表,我应该可以单击一个特定的文件来查看它的差异,如 Kaleidoscope 屏幕截图所示)

最佳答案

您可以以列出所有文件的方式使用 git difftool(推荐 git1.8+):

git difftool --dir-diff

Copy the modified files to a temporary location and perform a directory diff on them.
This mode never prompts before launching the diff tool.

然后您可以 integrate it with a BeyondCompare for instance .

或使用 WinMerge:

[diff]
tool = winmerge
[difftool "winmerge"]
path = C:/Program Files (x86)/WinMerge/winmergeu.exe
cmd = \"C:/Program Files (x86)/WinMerge/winmergeu.exe\" -r -u \"$LOCAL\" \"$REMOTE\"

所有这些:

    $ git difftool [<commit> [<commit>]]

唯一的问题是 Windows 上的 git diff-tool,描述为 in this blog post , 通过 nitoyon .

On Unix and MacOS, git difftool --dir-diff create a symbolic link to the working directory if a right-hand file has the same SHA1 as the file in the working directory. It's very useful when we modify right-hand files with a difftool.

On Windows, instead of creating symbolic links, git difftool --dir-diff copy back right-hand files to working directory after difftool program exits. I want to use symlinks on Git for Windows like Unix and MacOS.

注意:在 Windows 上,创建符号链接(symbolic link)需要管理员权限

Run GitBash as an administrator, and enter following command.

$ git difftool -d --symlinks [<commit> [<commit>]]

If you want, create an alias on .gitconfig.

[alias]
d = difftool -d --symlinks

但这需要:

  • 创建一个 git mklink 命令:
C:\Program Files (x86)\Git\libexec\git-core\git-mklink:

#!/bin/sh

cmd.exe /c "mklink \"$2\" \"$1\"" > /dev/null
  • 修补 msysgit 1.8.3:
cd /c/Program\ Files\ \(x86\)/Git/libexec/git-core/
$ patch < ~/git-difftool.patch

使用 git-difftool.patch:

    --- git-difftool    Sun Jun  2 11:28:06 2013
+++ git-difftool Tue Jul 9 00:42:02 2013
@@ -283,7 +283,7 @@
exit_cleanup($tmpdir, 1);
}
if ($symlinks) {
- symlink("$workdir/$file", "$rdir/$file") or
+ !system("git", "mklink", "$workdir/$file", "$rdir/$file") or
exit_cleanup($tmpdir, 1);
} else {
copy("$workdir/$file", "$rdir/$file") or
@@ -448,7 +448,7 @@
my $indices_loaded = 0;

for my $file (@worktree) {
- next if $symlinks && -l "$b/$file";
+ next if $symlinks;
next if ! -f "$b/$file";

if (!$indices_loaded) {

在 Git 2.34(2021 年第 4 季度)之前,“git difftool --dir-diff( man ) 符号链接(symbolic link)处理不当。

参见 commit 5bafb35 (2021 年 9 月 22 日)David Aguilar (davvid) .
(由 Junio C Hamano -- gitster -- merge 于 commit 6a4f5da ,2021 年 10 月 3 日)

difftool: fix symlink-file writing in dir-diff mode

Reported-by: Alan Blotz
Helped-by: Đoàn Trần Công Danh
Signed-off-by: David Aguilar

The difftool dir-diff mode handles symlinks by replacing them with their readlink(2) values.
This allows diff tools to see changes to symlinks as if they were regular text diffs with the old and new path values.
This is analogous to what "git diff"(man) displays when symlinks change.

The temporary diff directories that are created initially contain symlinks because they get checked-out using a temporary index that retains the original symlinks as checked-in to the repository.

A bug was introduced when difftool was rewritten in C that made difftool write the readlink(2) contents into the pointed-to file rather than the symlink itself.
The write was going through the symlink and writing to its target rather than writing to the symlink path itself.

Replace symlinks with raw text files by unlinking the symlink path before writing the readlink(2) content into them.

When 18ec800 ("difftool: handle modified symlinks in dir-diff mode", 2017-03-15, Git v2.13.0-rc0 -- merge listed in batch #6) added handling for modified symlinks this bug got recorded in the test suite.
The tests included the pointed-to symlink target paths.
These paths were being reported because difftool was erroneously writing to them, but they should have never been reported nor written.

Correct the modified-symlinks test cases by removing the target files from the expected output.

而且,还是 Git 2.34:

参见 commit 28c10ec , commit 8e2af8f , commit 2255c80 , commit 4ac9f15 (2021 年 9 月 30 日)David Aguilar (davvid) .
参见 commit 77bd616 (2021 年 9 月 23 日),以及 commit 93a8ed2 (2021 年 9 月 20 日)Junio C Hamano (gitster) .
(由 Junio C Hamano -- gitster -- merge 于 commit 0cc4ec1,2021 年 10 月 11 日)

difftool: refactor dir-diff to write files using helper functions

Signed-off-by: David Aguilar

Add a helpers function to handle the unlinking and writing of the dir-diff submodule and symlink stand-in files.

Use the helpers to implement the guts of the hashmap loops.
This eliminate duplicate code and safeguards the submodules hashmap loop against the symlink-chasing behavior that 5bafb35 ("difftool: fix symlink-file writing in dir-diff mode", 2021-09-22, Git v2.34.0 -- merge listed in batch #10) addressed.

The submodules loop should not strictly require the unlink() call that this is introducing to them, but it does not necessarily hurt them either beyond the cost of the extra unlink().

/* Write the file contents for the left and right sides of the difftool
* dir-diff representation for submodules and symlinks. Symlinks and submodules
* are written as regular text files so that external diff tools can diff them
* as text files, resulting in behavior that is analogous to to what "git diff"
* displays for symlink and submodule diffs.
*/
static void write_standin_files() {...}

关于Windows 中的 Git difftool 查看所有更改文件的列表以及文件差异(万花筒)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736427/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com