我试图在两个独立的存储库之间做一个git。单独使用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>在排除某些目录的同时,如何正确地区分两个不同的存储库?
发布于 2018-04-03 19:59:15
我在这里要说的很多是在其他答案和他们的评论中,但为了填补几个空白,强调几点,并提供我希望是一个单一的,有组织的,有用的答案:
大多数形式的git diff都希望在回购工作树中运行,以比较文件的两个版本(或一组文件中的每个版本)。对于要比较的每个文件,可能是将工作树版本与索引版本进行比较,或者将提交A中的版本与提交B中的版本进行比较。
但是,在这些情况下,您无法与回购之外的东西进行比较(例如,工作树外的路径)。如果您试图引用当前回购工作树之外的内容,而git认为您正在使用这些表单之一,那么它将引发一个错误。
有一种特定形式的git diff可以解除这一限制:
git diff [--no-index] path1 path2其中之一是:(a)包含--no-index选项,或者(b)其中一个路径位于当前回购的工作树之外。在这种情况下,git将比较文件系统上的两个任意路径。但是,与存储库相关联的git的各种特性--与历史版本相比--在使用此表单时是不可访问的。
所以,当你说
git diff projectA projectB因为你给出的路径不是都在一个回购工作树中,git认为它必须切换到这个特殊的形式,所以它是工作的。
但是:
这一种特殊的形式是相当有限的。您只需要列出两个根路径,而不是任意数量的路径规范,比如当您比较回购文件的版本时。当您开始尝试提供更通用的git diff语法时,git会说:“好吧,这不是文件系统到文件系统的比较语法,所以我不能在工作树之外使用这个路径”.你会得到你的错误信息。
所以你有两个选择。
您可以使用git以外的工具来比较目录。这样的工具可能具有基于路径的排除功能。
或者,您可以使用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明白了,您正在比较两个内容版本。
您还可以通过将ProjectB设置为ProjectA的远程(反之亦然)并进行抓取,从而使两个repos中的一个具有两个对象集。需要注意的是,仅仅删除遥控器并不一定会删除从其他回购中获取的所有对象。(它绝对不会马上把它们移除。)
发布于 2018-04-03 17:56:12
在以这种方式使用git diff时,我不知道排除路径的方法。如果有可能排除路径,那么您已经在问题中使用的神奇签名(:!)可能就是它。更多关于人类词汇魔术签名的信息。
如果有任何帮助,您可以通过添加一个作为另一个的远程来区分每个回购的提交。
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选项(隐式或显式)运行时,它会触发一个不同的代码路径。比较调用索引并提前返回。据我所知,索引并不称任何解析神奇路径规范的东西。
神奇的路径解析似乎是在上述代码路径返回之后发生的。具体来说,在比较中,有一个调用链树 -> oid -> 改名 -> 路径规范 -> 项目,这似乎就是神奇的路径解析发生的地方。
发布于 2018-04-03 18:14:47
我建议您只使用diff而不是git diff来进行比较。您可以告诉diff从比较中排除某些路径,以便自定义输出。缺点是diff和git diff的输出格式不完全相同。通常,这是不相关的,但在某些情况下,这很重要。
https://stackoverflow.com/questions/49636305
复制相似问题