有一个简单的应用程序的完整源代码,并需要创建基于它的教学材料。所以,我在想,从完整的源代码中初始化一个git存储库,然后开始以相反的顺序简化和删除部分,然后提交每个随后更简单的工作版本,直到只有一句"Hello,World!“遗骸。
问:如何在git存储库中反向提交,保留提交消息等,使其看起来像是按此顺序提交的?
只要最终结果是git repo,就可以使用任何其他VCS来完成简化部分。
发布于 2017-04-02 06:05:34
我编写了一个脚本" git -reverse.sh“,它可以完全反转git代码库的所有分支。
它使用git log --pretty="%T"和git commit-tree的组合来提取树哈希,并根据原始树对象(文件)创建新的提交对象,但父级边缘颠倒。
它似乎被一些回购卡住了。我也不知道原因。
你可以在这里找到它:
https://github.com/gsylvie/git-reverse.sh
示例用法
git clone --mirror [git-clone-url]
cd [repo.git]
./git-reverse.sh
git log --all --date-order --graph --decorate示例输出
$ ./git-reverse.sh
be0923ece8f73281e5e54906c29debb852894b92 - Reversed 1 of 360 (0%)
061bca59b29e75becbde66d2e510fc2b4059ccb2 - Reversed 2 of 360 (0%)
6a19039e05e3a0186187d0a6943634e8499b5a65 - Reversed 3 of 360 (0%)
7afe25e8caf93eb7107471a1bd078d4adc3f6999 - Reversed 4 of 360 (1%)
8b556f6fe97c5357c2328467a5ba01b77931ff82 - Reversed 5 of 360 (1%)
71fd0883975154f48059ca929db8ccb659c5049a - Reversed 6 of 360 (1%)
[etc...]
Switched to branch 'master'
Your branch and 'origin/master' have diverged,
and have 199 and 159 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
*********************************************
| Git repo successfully reversed!!! :-) (-: |
*********************************************
To push the reversed repo:
rm .git/packed-refs
rm -rf .git/refs/remotes
git push --mirror [new-git-clone-url]
WARNING:
========
Pushing a reversed git repo is a profoundly destructive and confusing operation.
You have a full 'git clone --mirror' backup stored somewhere safe, right?发布于 2013-02-03 21:15:47
我会使用git format-patch将补丁放入文件中,按照反时间顺序对它们进行排序(先按文件名编号,然后是sort -r),然后使用git apply --reverse将其作为新的提交应用到新的空存储库。然后,我将使用交互式rebase (-i)来修复细节和提交消息。
无论如何,git是一个很好的工具,因为你可以很容易地处理历史,但它需要一些工作。
编辑:
当我后来看到这一点时,我有了一个更好的想法。它不改变基本原则,只改变实现:
我希望你在主分支中有一些历史的存储库。因此,镜像提交超过当前头的最简单的方法是:
git checkout -b mirror
git log --format=%H | xargs -n 1 git revert现在你在master分支中有了旧的历史,并且master和mirror之间的新提交是从master反向提交的。就像照镜子一样。我猜您会想要删除旧的历史记录并编辑提交消息,所以请尽情享受git rebase -i的乐趣。
发布于 2013-02-04 13:01:46
如果存储库中的提交数量有限(我认为这是您制作教学材料时的情况),我认为您可以简单地以相反的顺序手动执行cherry pick。
A <- B <- C <- D <- E
^HEAD假设A是第一次提交,它是空的,而B是完整的文件集,C D E是逐步删除文件,我认为您可以从A处的另一个分支开始
A <- B <- C <- D <- E
^NewHead ^HEAD和樱桃挑选E,D,C,B到新的头:
A <- B <- C <- D <- E
^ ^HEAD
\- E' <- D' <- C' <- B'
^NewHead当然,如果确实有很多提交,那么导出补丁并在导入之前使用脚本操作它们(如其他答案所建议的)可能是更好的选择
https://stackoverflow.com/questions/14672041
复制相似问题