我尝试(在一个小型测试存储库中)将存储库导出为一系列.patch
文件,这些文件使用git format-patch
命令为每个提交生成,然后使用"重新构建存储库。 git init"在一个空目录上,后跟每个补丁文件的git apply
命令。它起作用 - 只有一个问题 - 当git am
将补丁应用于存储库而不是保留补丁的ID标记时,它会生成一个新问题。这可能是以后的问题,因为它可能使得很难确定哪些提交是多余的,哪些提交不是。
至于为什么我不使用常规方法克隆像git clone
这样的存储库 - 答案是通常说话,我做使用git clone
来克隆存储库 - 但我现在有非常具体的理由试图看看我是否可以这样做太长而无法详细说明(尽管我可能暗示因为后面这个问题的原因)---这些原因不仅太长,而且我看不出他们的最终细节会如何影响这个问题的正确答案。
但是,如果您告诉我.patch
不是用于此目的的正确文件格式,那么我可以使用。我想做的最重要的是:
将个人提交的个人提交提取到单个文件 - 并了解回购历史记录中这些文件的顺序等。
能够根据提交的提交版本完全重建repo
后来能够" de-canonize"任何我认为不应该提交的提交(以及保存在存储库历史中的那些提交将不值得它对项目历史规模造成的膨胀)以便我可以重新构建没有" de-canonized"提交。 (顺便说一下,方面#3与我希望能够做到这一点的原因非常相关。)
答案 0 :(得分:1)
我不是100%清楚你在这里问的是什么。当你说"提交ID-tag"时,我会假设你的意思是SHA。而且我根本不知道你的意思是什么"补丁ID-tag"。
猜猜......
当你在git中创建一个提交时,它附加了6个元数据。这些是作者姓名/电子邮件/时间和提交者姓名/电子邮件/时间。如果您从头开始创建新提交,则作者姓名/电子邮件和提交者姓名/电子邮件都将匹配。
他们不必这样做。您可以通过GIT_AUTHOR_NAME和类似的环境变量覆盖它们。如果你挑选或改变它,它将修改它们。
当您运行git format-patch
时,它并未提供所有的提交者信息。
同样,当您运行git am
时,它不会查找提交者信息,而是使用运行git am
的任何人的姓名和电子邮件覆盖它。如果该信息发生变化,这将导致创建不同的SHA。
没有简单的方法来解决它(你必须破解格式补丁和我保留comitter信息。但是,你可以计算提交补丁ID(git patch-id)而不是比较提交SHA。那些。它们应该完全相同。