【问题标题】:Directory comparison of Git branchesGit分支目录对比
【发布时间】:2010-11-22 18:24:13
【问题描述】:

我最喜欢的 svn 工作流程之一是使用 Beyond Compare 的文件夹比较功能来查看两个分支或一个分支和主干之间的净差异。有没有办法在 git 中执行此操作而无需手动创建同一存储库的多个克隆?

当我问这个问题时,我突然想到我可以编写一个脚本,将当前 repo 克隆到一个临时目录,签出所需的分支,然后使用两个目录作为参数调用 BCompare.exe。文件夹比较视图被调用

BCompare.exe path/to/folder1 path/to/folder2

这听起来合理吗?完成 Beyond Compare 后是否可以删除多余的克隆?

【问题讨论】:

  • "我可以删除多余的克隆吗...?"你为什么不呢?
  • 嗯,理想情况下,我想在后台启动超越比较,这样我就可以继续在同一个终端中使用 git 来查看日志等。我不确定什么会检测到我已经关闭而无法比较,并且可以安全地删除临时克隆。

标签: git beyondcompare beyondcompare3


【解决方案1】:

这个(比较目录而不是逐个文件)应该很快就会可用:
[ANNOUNCE] Git 1.7.11.rc1

git difftool”学习了“--dir-diff”选项来生成外部差异工具,这些工具可以在填充两个临时目录后一次比较两个目录层次结构而不是运行每个文件对的外部工具实例一次

参见“Patch difftool: teach difftool to handle directory diffs”,来自此fork of git

当调用“difftool”来比较修改多个文件的一系列提交时,它会为每个更改的文件打开一个单独的差异工具实例。

新的“--dir-diff”选项将所有修改后的文件复制到一个临时位置,并在 diff 工具的单个实例中对它们运行目录 diff。

【讨论】:

  • 如果我可以多次投票,我会的。这是完美的,应该是公认的答案。
  • 天哪,这改变了我的生活!
【解决方案2】:

听起来您已经找到了正确的答案——使用git clonegit checkout 设置要比较的目录,然后运行BCompare.exe。下面的脚本可能是一个很好的起点。

#!/bin/sh
(                              # execute in a subshell so you can continue
                               #   working in the current shell
    set -o xtrace              # bash setting that echos each command before it's executed
    > /tmp/auto_bcompare_log   # truncate existing log file
    BRANCH="$1"                # get branch argument from command line
    TEMPDIR=`mktemp -d`        # get a temp directory
    CWD=`pwd`                  # remember the current directory
    git clone $CWD $TEMPDIR
    cd $TEMPDIR
    git checkout $BRANCH
    cd $CWD
    BCompare.exe $CWD $TEMPDIR
    rm -rf $TEMPDIR
) >> /tmp/auto_bcompare_log 2>&1 < /dev/null & # background and redirect
                                               # stdout/stderr/stdin

【讨论】:

  • 这或多或少对我有用。我取出了日志记录的东西,因为我宁愿在命令行上看到它 gimp'd 以便它可以与 msysgit 一起使用,并且我将它设为别名。它作为别名的好处是你可以在 repo 的任何目录中,它会自动运行。我选择不使用 () 因为我总是可以使用 & 让它在后台运行。别名本身在下一条评论中。
  • git config --global alias.ddiff '!sh -c "TWD=/ddifftmp; mkdir $TWD; CWD=pwd; git clone $CWD/.git $TWD; cd $TWD ; git checkout $1; cd $CWD; BComp.exe $TWD $CWD; rm -rf $TWD;'
【解决方案3】:

只需 git diff 与您要比较的分支的名称或哈希值,就这么简单。实际上,您可以通过哈希值比较任意两个提交。

【讨论】:

  • 如果我不喜欢 git diff 的内联比较和任意文件排序的强制线性,那么我是 SOL?我知道我也可以 git difftool b1 b2 但这并没有给我文件夹比较视图。
  • 嗯,抱歉,我没有明白你的问题,我以为你只是想比较两个提交。您正在使用超越比较作为我假设的差异工具,对吗?不幸的是,我对此并不熟悉。
  • @drhorrible:所以你的问题实际上是如何获得这个特定的“文件夹比较视图”,而不仅仅是如何查看两个分支之间的差异。可能需要编辑以使其更清晰。
【解决方案4】:

首先验证您是否可以访问,

您可以使用:git difftool --tool-help 列出可用的比较工具。 (要将其设置为默认值,请参阅Git Diff with Beyond Compare

如果您无法比较,您可以使用其中之一:

git difftool branch1 branch2 file -t bc   // or -d directory instead of file
git difftool hash1   hash2   file -t bc

编辑:在 git 版本 2.25 中工作

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多