我认为您的意思是假设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 --