【问题标题】:Diffing between two entire directories/projects in hg or git?hg 或 git 中的两个完整目录/项目之间的差异?
【发布时间】:2010-12-19 23:54:23
【问题描述】:

我继承了一个最初存储在 CVS 中的项目,其中包含所有修订。我做了很多编辑,我正在尝试比较我在原始目录中所做的所有更改,包括添加的新文件和旧文件。

是否有某种用于 hg/git 的实用程序,我可以在其中进行树差异或类似的事情?这么说来,新增文件、删除文件之间有一个标记,是不是要求太多了?

【问题讨论】:

标签: git version-control diff cvs mercurial


【解决方案1】:

git diff 正是这样做的。但它只适用于 git 项目。

hg diff, svn diff 几乎每个版本控制系统都可以区分目录树

【讨论】:

  • 您能否详细说明我如何使用git diff?我创建了两个单独的 git 项目,我现在如何比较它们?我对 VCSing 还是比较陌生。
  • 您只需要一个项目。提交所有文件,进行更改,再次提交。然后您可以执行git diff HEAD^..HEAD,它将您的最新版本与之前的版本进行区分
  • 好的 - 我想我得到了我想要的,因为我看到了大量的结果,你能推荐一个不错的 GUI 吗?
  • 试试gitkgit gui,gitk可视化项目历史,git gui允许你准备提交等等
  • 其实git diff可以比较任意文件/目录;你可能需要使用它的--no-index 选项
【解决方案2】:

它不是特定于 git 的,但作为 Windows 的通用 diff 实用程序,我真的很喜欢 WinMerge

【讨论】:

    【解决方案3】:

    我不太明白你想要什么,但diff -ur 对你来说还不够吗?它甚至可以在没有任何版本控制的目录上工作。

    【讨论】:

      【解决方案4】:

      来自git diff manpage

      git diff [--options] [--] [<path>...]

      [...]
      如果恰好给出了两个路径,并且至少有一个未跟踪,则比较两个文件/目录。 --no-index 可以强制执行此行为。


      如果您想比较两个不同存储库中的两个版本(例如两个标记的版本或两个分支),您可以使用 Git Wiki 上“如何比较两个本地存储库”下的 GitTips 页面中描述的技巧。

      假设你在一个仓库中,第二个仓库在/path/to/repo,那么它的GIT_DIR是/path/to/repo/.git,如果是非裸仓库,你可以像下面这样:

      $ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
         git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B
      

      其中 A 和 B 是您要比较的版本。当然你也可以在上面的表达式中指定路径限制器。

      说明: GIT_ALTERNATE_OBJECT_REPOSITORIES 变量可用于使 git 命令连接两个存储库的对象数据库。 git --git-dir=... rev-parse ... 用于将存储库中作为参数提供给git-dir 选项的名称(扩展的 SHA-1 表达式)转换为唯一的 SHA-1 标识符。 $( ... ) 构造将调用给定命令的结果放在命令行中。 git diff 用于比较两个修订版(其中一个来自备用对象存储库)。

      替代解决方案是使用git remote add(和git fetch)简单地将其他存储库导入到给定的存储库中。然后,您将在本地拥有所有内容,并且能够在单个存储库中进行比较。

      【讨论】:

        【解决方案5】:

        只需从两个任意文件或目录以 git 的 diff 格式创建一个 diff 补丁无需任何花哨的存储库或版本控制

        git diff --no-index some/path other/path > some_filename
        

        Jakub Narębski 对 knittl 答案的评论暗示了答案......为简单起见,这是完整的命令。

        > 部分创建一个文件并将输出重定向到该文件。如果您不想要文件而只想在控制台中打印输出以便复制它,只需删除 > some_filename 部分。


        为了方便复制和粘贴,如果您已经 cded 到包含名为 a 的原始目录/文件和修改后的目录 b 的目录,它将是:

        git diff --no-index a b > patch
        

        【讨论】:

        • 要使用git diff 选项,请在路径前添加选项。例如。 git diff --name-status --no-index some/path other/path--name-status 选项一起使用。
        • 对二进制文件使用--binary,否则补丁只会说“二进制文件不同”
        • 来自 git-diff 手册页:“在由 Git 控制的工作树中运行命令并且至少有一个路径指向工作树之外时,或者在运行时,您可以省略 --no-index 选项由 Git 控制的工作树之外的命令。”
        【解决方案6】:

        是否有某种用于 hg/git 的实用程序,我可以在其中进行树差异... [s]也就是说,在新添加的文件、删除的文件之间有一个标记... [强调]

        是的。我们可以git diff当前目录针对另一个目录,然后...

        ...标记添加、删除和修改的文件:

        git diff --name-status --no-index ./ path/to/other/dir
        

        ...仅显示添加的文件:

        git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir
        

        ...仅显示已删除的文件:

        git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir
        

        ...仅显示修改后的文件:

        git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir
        

        另请参阅:https://git-scm.com/docs/git-diff

        【讨论】:

          【解决方案7】:

          在两个完整的目录/项目之间有以下另一种区分方式。

          1. 在 Git 中有语法:

          语法:git-diff [] [--] […​] 此表单用于查看您相对于索引(下一次提交的暂存区)所做的更改。换句话说,差异是您可以告诉 Git 进一步添加到索引中但您仍然没有添加的内容。

          这里是。 网址:https://git-scm.com/docs/git-diff

          git diff --no-index 目录 1 项目/路径 目录 2 项目/路径 >> 文件名

          1. 使用 Linux 命令 diff --brief --recursive dir1path/ dir2Path/

          2. 如果您使用的是 Windows,则有一个应用程序 WinMerge

          【讨论】:

            【解决方案8】:

            创建从 dir1 到 dir2 的补丁(--binary 仅用于二进制文件):

            git diff --no-prefix --no-index --binary dir1 dir2 > dir.diff
            

            将补丁应用于工作目录的内容,与dir1内容相同:

            cd dir1_copy
            git apply ../dir.diff
            

            git apply 具有默认的 -p1,它会去除 diff 命令中的前导目录。

            【讨论】:

              猜你喜欢
              • 2011-04-28
              • 1970-01-01
              • 2013-08-28
              • 2020-10-12
              • 1970-01-01
              • 2022-12-02
              • 2014-06-02
              • 2012-12-25
              • 1970-01-01
              相关资源
              最近更新 更多