2014-12-02 107 views
5

提交历史我已经合并3个不同的git回购到一个 现在我的历史看起来是这样的:重新排序混帐按日期

A1-A2-A3-B1-B2-B3-C1-C2-C3

现在我想按日期重新排序所有这些提交。所以最后它可能是类似 C1-A1-A2-B1-C2 -...你得到的想法

我没事,如果我失去了所有原始的SHA提交id。 当然,我不能手工重新排序,所以我需要一些脚本或一些想法如何解决这个问题。

回答

0

您不能重新排列A1-A2-A3-B1-B2-B3-C1-C2-C3没有做手工

4

这只是一个想法,我没有测试对于这种情况但我用它(以不同的方式)到join two Git repositories and keep the original commit dates

如果历史有分支和合并,我认为不可能重新排列它们并保持结构,甚至手动。你能得到的最好的是线性历史。

保存提交散列和时间戳(%ct =提交日期,%at =作者日期)到一个文件中,由作者日期对它们进行排序:

$ git log --pretty='%H %at %ct' --author-date-order --reverse > /tmp/hashlist 

如果由命令提供的顺序以上不满足然后通过使用其第二场(作者日期)排序输出力的顺序:

$ git log --pretty='%H %at %ct' | sort -k 2 > /tmp/hashlist 

创建一个新的版本库中保存的作者日期排序的历史。创建初始提交设置在过去的提交日期(之前最古老的承诺在你的仓库):

$ GIT_COMMITTER_DATE='2010-01-01 12:00:00' GIT_AUTHOR_DATE='2010-01-01 12:00:00' git commit --allow-empty 

把自己的日期到上面的命令。

将旧存储库作为远程存储添加到新存储中,并提取所有提交。 不要设置新回购的master分支来跟踪旧回购之一。

创建一个脚本,将樱桃挑提供承诺并将其应用在当前分支之上,保持原作者日期并提交日期:

$ echo '[email protected]$2 [email protected]$3 git cherry-pick $1' > /tmp/pick 
$ chmod +x /tmp/pick 

如果你不想让无论是原始作者日期或提交者日期(或两者),然后从上述命令行中删除相应的分配。

使用新脚本xargs挑选所选顺序中的每个提交并将其提交到新的主分支上。

$ cat /tmp/hashlist | xargs -n 3 /tmp/pick 

如果一切顺利,则删除在此过程中创建的临时文件。

$ rm /tmp/hashlist 
$ rm /tmp/pick 

备注:

  • 你会得到一个线性的历史。原始分支和合并不会重新创建到新的历史时间表中。
  • 未装入的分支根本不会被复制。您可以使用git rebase将它们复制并附加到新的提交。
  • 即使您的回购没有分支机构,仍然有很大的可能性在樱桃采摘上发生冲突;它取决于新订单中提交引入的很多更改。
  • 如果它不起作用,您可以随时删除新的存储库并重新开始(或退出尝试);旧版本库不会更改。
+0

你的想法似乎合乎逻辑。现在樱桃采摘正在运行。希望没有/轻微冲突 – Blitzkr1eg 2014-12-02 12:52:37

+0

有很多冲突,所以放弃了这种方法。所以我让他们像合并后的A1-A2-A3-B1-B2-B3-C1-C2-C3一样。 – Blitzkr1eg 2015-11-01 10:00:56

+0

当它创建一个diff时,'git'不仅记录改变的行,而且记录改变的上下文(改变之前的1行和1行)。它在应用diff时使用这些行以确保diff可以安全应用。如果上下文行不匹配(f.e.是因为它们是由原始时间行中较早的提交添加/更改的,但您希望稍后在修改的时间行中应用),则会出现冲突。不幸的是自动解决冲突并不安全。如果你遇到很多冲突,那么也许改变提交的顺序是不可能的。 – axiac 2015-11-01 21:34:42