首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将目录排除在两个独立存储库的git diff中

将目录排除在两个独立存储库的git diff中
EN

Stack Overflow用户
提问于 2018-04-03 17:50:47
回答 3查看 1.8K关注 0票数 2

我试图在两个独立的存储库之间做一个git。单独使用git diff ProjectA ProjectB是可行的,但我必须浏览.git目录中的所有差异。

我尝试过git diff ProjectA ProjectB -- . ':!.git'来排除.git目录,但是我得到了以下错误。

代码语言:javascript
运行
复制
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',但只收到了这样的消息:

代码语言:javascript
运行
复制
usage: git diff --no-index <path> <path>

在排除某些目录的同时,如何正确地区分两个不同的存储库?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-03 19:59:15

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

大多数形式的git diff都希望在回购工作树中运行,以比较文件的两个版本(或一组文件中的每个版本)。对于要比较的每个文件,可能是将工作树版本与索引版本进行比较,或者将提交A中的版本与提交B中的版本进行比较。

但是,在这些情况下,您无法与回购之外的东西进行比较(例如,工作树外的路径)。如果您试图引用当前回购工作树之外的内容,而git认为您正在使用这些表单之一,那么它将引发一个错误。

有一种特定形式的git diff可以解除这一限制:

代码语言:javascript
运行
复制
git diff [--no-index] path1 path2

其中之一是:(a)包含--no-index选项,或者(b)其中一个路径位于当前回购的工作树之外。在这种情况下,git将比较文件系统上的两个任意路径。但是,与存储库相关联的git的各种特性--与历史版本相比--在使用此表单时是不可访问的。

所以,当你说

代码语言:javascript
运行
复制
git diff projectA projectB

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

但是:

这一种特殊的形式是相当有限的。您只需要列出两个根路径,而不是任意数量的路径规范,比如当您比较回购文件的版本时。当您开始尝试提供更通用的git diff语法时,git会说:“好吧,这不是文件系统到文件系统的比较语法,所以我不能在工作树之外使用这个路径”.你会得到你的错误信息。

所以你有两个选择。

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

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

代码语言:javascript
运行
复制
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明白了,您正在比较两个内容版本。

您还可以通过将ProjectB设置为ProjectA的远程(反之亦然)并进行抓取,从而使两个repos中的一个具有两个对象集。需要注意的是,仅仅删除遥控器并不一定会删除从其他回购中获取的所有对象。(它绝对不会马上把它们移除。)

票数 0
EN

Stack Overflow用户

发布于 2018-04-03 17:56:12

在以这种方式使用git diff时,我不知道排除路径的方法。如果有可能排除路径,那么您已经在问题中使用的神奇签名(:!)可能就是它。更多关于人类词汇魔术签名的信息。

如果有任何帮助,您可以通过添加一个作为另一个的远程来区分每个回购的提交。

代码语言:javascript
运行
复制
cd ProjectA
git remote add ProjectB ../ProjectB
git fetch ProjectB
git diff <commit-or-branch-in-ProjectA> <commit-or-branch-in-projectB>

当您完成扩散时,您可以移除遥控器:

代码语言:javascript
运行
复制
git remote remove ProjectB

再深入一点,当git diff使用--no-index选项(隐式或显式)运行时,它会触发一个不同的代码路径。比较调用索引并提前返回。据我所知,索引并不称任何解析神奇路径规范的东西。

神奇的路径解析似乎是在上述代码路径返回之后发生的。具体来说,在比较中,有一个调用链 -> oid -> 改名 -> 路径规范 -> 项目,这似乎就是神奇的路径解析发生的地方。

票数 1
EN

Stack Overflow用户

发布于 2018-04-03 18:14:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49636305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档