我正在尝试在两个单独的存储库之间进行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两个不同存储库的正确方法是什么?
答案 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从比较中排除某些路径以自定义输出。缺点是diff
和git 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中的一个具有两组对象来完成此操作。要注意的是,只是删除遥控器不一定会删除从其他仓库中取出的所有对象。 (它绝对不会立即删除它们。)