从两个单独的存储库中的git diff中排除目录

时间:2018-04-03 17:50:48

标签: git git-diff

我正在尝试在两个单独的存储库之间进行git diff。单独使用git diff ProjectA ProjectB有效,但我必须滚动查看.git目录中的所有差异。

我已尝试git diff ProjectA ProjectB -- . ':!.git'排除.git目录,但收到以下错误。

Not a git repository
To compare two paths outside a working tree:
usage: git diff [--no-index] <path> <path>

我也试过git diff --no-index ProjectA ProjectB -- . ':!.git',但收到的信息是:

usage: git diff --no-index <path> <path>

在排除某些目录时git diff两个不同存储库的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

我不知道以这种方式使用git diff时排除路径的方法。如果可以排除路径,那么您在问题中使用的魔术签名(:!)也许就是它。有关man gitglossary的魔法签名的更多信息。

如果它有任何帮助,你可以通过添加一个作为另一个的遥控器来提升每个回购的提交。

cd ProjectA
git remote add ProjectB ../ProjectB
git fetch ProjectB
git diff <commit-or-branch-in-ProjectA> <commit-or-branch-in-projectB>

完成差异后,您可以删除遥控器:

git remote remove ProjectB

深入挖掘,看起来当git diff使用--no-index选项(隐式或显式)运行时,它会触发不同的代码路径。 cmd_diff调用diff_no_index并提前返回。据我所知,diff_no_index并没有调用任何解析魔法路径规范的东西。

神奇的pathspec解析似乎是在上面提到的代码路径已经返回之后发生的。具体而言,在cmd_diff中进一步向下,有一个调用链builtin_diff_tree - &gt; diff_tree_oid - &gt; try_to_follow_renames - &gt; parse_pathspec - &gt; init_pathspec_item,这似乎是魔术路径规范解析发生的地方。

答案 1 :(得分:1)

我建议您只使用diff代替git diff进行比较。您可以告诉diff从比较中排除某些路径以自定义输出。缺点是diffgit diff的输出格式不完全相同。通常,这是无关紧要的,但在某些情况下很重要。

答案 2 :(得分:0)

我在这里要说的很多是在其他答案和评论中,但要填补一些空白,强调几点,并且通常提供我希望的单一,有组织,有用的答案:

大多数git diff形式的git diff期望在repo工作树中运行,以比较文件的两个版本(或每个文件集的两个版本)。对于要比较的每个文件,您可能正在将工作树版本与索引版本或提交A中的版本与提交B中的版本进行比较。

但是,在这些情况下,您无法与回购以外的内容进行比较(例如工作树之外的路径)。如果您尝试引用当前repo工作树之外的某些内容,并且git认为您正在使用其中一种形式,那么它将引发错误。

有一种特定形式的git diff [--no-index] path1 path2 解除了这一限制:

--no-index

其中:(a)您包含git diff projectA projectB 选项,或(b)其中一个路径位于当前repo的工作树之外。在这种情况下,git将比较文件系统上的两个任意路径。但是,使用此表单时,无法访问绑定到存储库的git的各种功能(如与历史版本进行比较)。

所以,当你说

git diff

因为你给出的那些路径不是都在一个repo工作树中,git认为它必须切换到这个特殊形式,所以它可以工作。

可是:

一种特殊形式非常有限。您只能列出两个根路径 - 而不是任意数量的路径规范,例如比较仓库中文件的版本时。当你开始尝试提供更通用的mkdir compare cd compare git init git remote add ProjectA ../ProjectA git remote add ProjectB ../ProjectB git fetch ProjectA git fetch ProjectB git diff ProjectA/master ProjectB/master 语法时,git说“好吧,这不是文件系统到文件系统的比较语法,所以我不能在工作树之外有这条路径”......并且您收到了错误消息。

所以你有两个选择。

您可以使用git之外的工具来比较目录。这样的工具可能具有基于路径的排除功能。

或者,您可以使用git,但只需在一个回购中进行比较。

Object.keys(this.props.posts).map(function(key) {
  return <div>Key: {key}, Value: {this.props.posts[key]}</div>;
})

现在git知道你正在比较两个内容版本。

您也可以通过将ProjectB设置为ProjectA的远程(反之亦然)并获取以使两个repos中的一个具有两组对象来完成此操作。要注意的是,只是删除遥控器不一定会删除从其他仓库中取出的所有对象。 (它绝对不会立即删除它们。)

相关问题