Git diff通过忽略.git文件来复制输出

时间:2018-05-31 12:12:07

标签: git github git-diff

我正在创建一个Jenkins管道,我必须将两个分支master和devlop分支到工作区克隆到不同的目录中并比较文件并仅将更改的文件拉到另一个目录。我正在使用以下命令 git diff --name-only GIT-develop-branch GIT-master-master-branch

如何使用上述命令通过ignore .git文件将已更改的文件从dir1和dir2复制并粘贴到dir3。 或者,如果有任何其他方式请分享。

1 个答案:

答案 0 :(得分:1)

我认为您的意思是假设master未更改,并且您希望将develop版本复制到第三个目录。 (我对此不确定;要求在评论中澄清。如果它有所不同,我会在得到澄清之后进行更新。)

更新以获取您的评论:

首先,您没有解决我要求的澄清问题。所以我继续假设你想要不同文件的develop版本。如果删除或重命名文件,仍然不清楚你想要做什么;所以我之前就该问题提供的指导意见保持不变。

1)你说

  

我已将这两个分支克隆到Jenkins工作区中的单独目录

是的,正如我之前所说,这似乎并不是一种善用资源的方式。正如我之前所说,你可能不需要签出,即使你这样做也会更有效率使用git worktree而不是创建两个完整的存储库。

2)你说

  

因为我在开发分支的目录中制作或添加了一些文件我想只拉那些我已经改变的文件,而不是把所有其他文件拉到第三个目录

这就是原始答案所做的。

3)你说

  

并且我也想在没有任何.git日志的情况下提取所有文件。

checkout始终只是内容。历史记录位于repo数据库中,只有在您创建多个克隆时才会重复(因此,上面的第1点)。

4)你说

  

我克隆主分支仅用于比较目的,以便我可以在两个分支之间进行区分

同样,您不需要克隆来进行比较。你甚至不需要签出工作副本。原始答案中都包含了这一点。

首先,您可以在不检查它们的情况下对分支进行区分。如果你需要两个工作副本用于其他东西,那很好,但我仍然不会将它们用于创建差异的目的。 (另外,听起来你正在制作整个回购的两个克隆;你可能想要考虑使用git worktree代替,将多个工作树附加到一个回购。但这并不是与你的问题有关...)

git diff --name-only master develop

根据您希望处理正在移动/重命名的文件的方式(或git可能错误地将其解释为正在移动/重命名的文件的更改),您可能需要添加--no-renames选项。

git diff --name-only --no-renames master develop

这将确保显示更改中涉及的任何路径,而如果没有此选项,如果git认为fileA已移至fileB,则列表中仅包含fileB。如果您只是尝试获取develop目录的更改子集,那可能就是您想要的......但同样,这取决于您尝试做的事情。

与该问题相关的问题是,您希望如何处理master中但develop中没有的文件。在上面的重命名示例中,fileA将是这样的文件;但是你也可能file5只是在develop分支中被删除了。虽然--no-renames选项(或缺少选项)控制是否显示fileA,但默认情况下file5会出现在列表中。你可以抑制它;如果您不想查看已删除项目的文件名(或"在#34;移动文件的文件名之前),您可以使用

git diff --name-only --diff-filter d master develop

(如果您尝试将--diff-filter d--no-renames合并,移动文件的"之前的名称将显示为删除,然后由diff-filter抑制再一次,关键是你需要在列表中知道你想要什么。)

现在要将列出的文件的develop版本复制到工作树中,您只需使用git checkout;你可以将它与xargs

结合在一起
git diff --name-only --diff-filter d master develop |xargs git checkout develop --