【问题标题】:Git diff to copy output by ignoring .git filesGit diff 通过忽略 .git 文件来复制输出
【发布时间】:2018-05-31 12:12:07
【问题描述】:

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

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

【问题讨论】:

  • "...仅拉取更改的文件..." -- 更改文件的哪个版本? master 版本? develop 版本?包含两者更改的合并版本?

标签: git github git-diff


【解决方案1】:

我认为您的意思是假设master 不变,并且您想将develop 版本复制到您的第三个目录。 (我不确定;要求在 cmets 中进行澄清。如果有什么不同,我会在得到澄清后更新。)

更新您的评论如下:

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

1) 你说

我已将这 2 个分支克隆到 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 将默认出现在列表中。你可以压制它;如果您不想看到已删除项目的文件名(或移动文件的“之前”文件名),您可以使用

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 --

【讨论】:

  • 嗨,我已将这两个分支克隆到 Jenkins 工作空间中的单独目录。因为我在开发分支的目录中创建或添加了一些文件,所以我只想拉那些我已经更改的文件,而不是将其他所有文件拉到第三个目录。而且我只想在没有任何 .git 日志的情况下提取所有文件。我克隆主分支仅用于比较目的,以便我可以在两个分支之间进行差异并仅提取更改的文件
  • 您好,感谢您的回复。我不确定 git diff 是如何工作的,我想克隆 2 个分支 master(未更改的分支)和 development(已更改的分支)并将它们都进行比较,然后仅将更改的文件拉入新目录。我在詹金斯服务器上这样做。
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2016-04-09
  • 1970-01-01
  • 2011-10-17
  • 2013-07-23
相关资源
最近更新 更多