如何在Git仓库中获取文件更改而忽略新文件

5
我有一个git仓库,其中包含自动生成的源代码文件夹。随着时间的推移,这些代码文件夹中进行了一些微小的手动修改。现在我需要重新生成这些文件,但不想错过任何已经修改过的内容。
我想做的是获取该文件夹中所有更改的差异,但要排除每个文件的原始“添加”。这样我就可以将差异应用于新的文件集。
还有一个重要的细节:并非所有文件都是同时添加的。添加操作与编辑操作混合在一起。因此,从特定提交开始生成差异并不像看起来那么简单。
有什么好的想法吗?
更多背景:
- 自动生成的文件是从WSDL文件生成的SOAP代理类。 - 我们正在处理多个服务,因此根据需要添加类。 - 我们收到了一个包含小修复的WSDL的更新服务器VM。 - 用于生成代理类的工具有一些不完整的实现,因此对这些文件所做的更改是解决方法。
种子:
- 有没有办法知道文件的第一个提交的SHA?我猜测是带有grep或sed的git log的变体? - 或许可以获取特定文件上的提交计数,其中1 == 仅插入而没有更改,然后我可以grep那些内容?

你曾经因为缺乏远见而陷入僵局...手动完成这项工作(并编写脚本)。然后修复流程,以防止再次发生。我会为每个生成的文件编写一个手动的合并bash脚本,并多次运行该脚本。但愿没有涉及重命名 :) - sehe
为什么你不能从当前版本重新生成文件呢? - knittl
1
目前我想到的是使用自定义脚本,我主要是想知道是否有什么 Git 可以为我完成的工作。 - Sebastien Martin
@knittl,我认为问题在于生成的文件可能会(或许)发生巨大变化,他只想重新应用之前生成的文件中所做的更改,因此只需重新生成并使用当前版本进行差异/合并即可显示所有自动生成的更改... - johnny
自动生成的代码的更改实际上将非常小。它们来自 Web 服务的维护版本的更改。但是,即使我可以获得一个不适用于新文件的差异,这也是一步向前迈进,因为我至少可以更好地查看所做的更改。 - Sebastien Martin
2个回答

1

修订后的答案:

您需要一些脚本来遍历该目录,并使用每个文件获取初始提交:
git log --format=%H fileName | tail -1

然后使用以下命令获取差异:
git diff ^output_of_above SHA_last_commit fileName


抱歉,我误读了你的问题。我刚刚更新了答案。 - Andy
我仍然认为这不起作用...每个文件的两个SHA可能不同。而且“SHA_first_commit ^ SHA_last_commit”不会给我除最后一个之外的所有更改吗? - Sebastien Martin
也许我没有理解你的问题。这将为您提供在您指定的两个提交之间更改的所有内容,包括 foldername/* 中的内容。这是您想要的吗? - Andy
好的。那么我可能会寻找类似于^first last这样的内容,因为我不想包括文件最初添加时的内容。但这仍然没有解决真正的问题。由于某些文件是随后添加的,因此并没有单个SHA_first适用于所有文件。 - Sebastien Martin
1
你可以使用 git log --diff-filter=A -- <filename> 命令获取初始提交(查找添加了该文件的“更改”)。 - johnny
显示剩余5条评论

1

我假设你仍然拥有旧版的WSDL文件,因为你是一个好的源代码控制用户。在这种情况下,我建议你执行以下操作:

  • 从添加任何相关文件之前创建并检出一个新分支。
  • 使用旧版WSDL文件生成类并提交。
  • 使用新版WSDL文件生成类并提交。
  • 检出主分支并合并新分支。

这将把自动生成的文件的差异与您手动调整的内容合并。

保留该分支,以便每次WSDL文件更改时,您都可以检出该分支并重复最后两个步骤。基本上,该分支应始终只包含自动生成的文件。


这是一个好建议。它有点简化了,因为原始文件(来自同一个WSDL)会随着需要逐步添加。所以诀窍是始终将这些自动生成的文件添加到分支,并将其合并到主分支中?然后在主分支中进行所有更改? - Sebastien Martin
此外,值得注意的是,我们拥有30个以上的WSDL文件,这就是为什么我们没有一次性生成和提交所有内容的原因。我们只是在实现功能时添加我们需要的内容。虽然这样做会简化这个过程。 - Sebastien Martin
无论它们是否逐步添加到“master”中,都没有关系。只要从它们被全部添加到“master”之前的某个点创建了“autogen”分支,并且在它们全部添加后的某个点之后才合并,你就可以将它们全部添加到“autogen”分支中。你无法从“autogen”中构建任何有用的东西,但这并不重要。它的唯一目的是帮助你合并这部分文件。 - Karl Bielefeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接