我已将3种不同的git repos合并为一种 现在我的历史看起来像这样:
A1-A2-A3-B1-B2-B3-C1-C2-C3
现在我想按日期重新排序所有这些提交。所以最后它可能是这样的 C1-A1-A2-B1-C2 -...你明白了
如果我放弃所有原始的SHA提交ID,我没问题。 当然我不能手工重新排序,所以我需要一些脚本或一些想法来解决这个问题。
答案 0 :(得分:5)
这只是一个想法,我没有针对这种情况进行测试,但我(以不同的方式)使用它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 'GIT_AUTHOR_DATE=@$2 GIT_COMMITTER_DATE=@$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
复制并将其附加到新提交。答案 1 :(得分:2)
假设您只想更改一个分支(master
)上的提交顺序。
创建分支的副本。此步骤是可选的,您可以直接在master
分支上进行此操作。
git checkout -b master2 master
创建所有提交的列表。此命令将按照作者时间(最早的时间)对其进行排序。
git log --pretty='%H %at' | sort -k2 -n | awk '{ print "pick "$1 }' > /tmp/rebase.list
输出文件如下:
pick <hash of C1>
pick <hash of A1>
pick <hash of A2>
pick <hash of B1>
..
运行交互式资源库,直到存储库的根目录
git rebase -i --root
您将看到当前的提交列表。删除所有内容并加载rebase.list
文件的内容(如果您的编辑器恰好是vi,则发出命令:1,$d
和:r /tmp/rebase.list
)。保存并退出。
解决冲突后,您应该以{{1}}分支结束,并重新排列所有提交。
答案 2 :(得分:0)
你不能手动重新排列A1-A2-A3-B1-B2-B3-C1-C2-C3