我正在将旧的svn存储库导入git。某个时刻,所有分支中的文件夹都被重命名。这是通过在svn中创建具有历史记录的副本,然后在第二次提交时删除原始副本来完成的。因此,我有一个如下所示的仓库:
A -> B -> C -> D* -> E* -> F -> G -> H
\-> 1 -> 2* -> 3* - > 4 -/
D / E和2/3是我要压缩的提交。压榨的原因是,尽管svn知道“与历史记录重复”,但git不会将其视为重命名,因为直到下一次提交才删除原始文件,这时我不得不责备历史记录。
我已经尝试了一些可以工作的rebase脚本,但是它们也使我的所有分支扁平化。上面是我必须做的一个认真简化的版本,这就是为什么我真的需要脚本的原因,因为我无法手动完成它。在SVN回购的整个历史中,有1000多个分支,并且可能有十多个并行分支在同一时间完成了更改。
git repo尚未发布,因此保持哈希值无关紧要。我假设我需要使用一些过滤分支脚本,但是我仍在尝试找出如何管理的方法,这就是我希望可以在这里获得帮助的方法。我可以提供需要压缩的每个提交的sha1及其父对象。
您想使用git filter-branch
using--parent-filter
来将任何外观D
的SHA替换为C
SHA。您也可以查看.git/info/grafts
或git replace
,这可能比编写a更简单,--parent-filter
并且可以使用使其永久化filter-branch
。
更新:正如@torek所说,您绝对应该使用git replace
。要使用一个真实的例子,这是从readme.md
到重命名的README.md
执行,中间是重命名为README1.md
:https : //github.com/dahlbyk/posh-git/compare/dahlbyk : 2b9342c... dahlbyk : 57394c5。让我们叫2b9342c
你C
和57394c5
你E
:
$ git tag E 57394c5
$ git tag C 2b9342c
$ git tag G 450d8f1
$ git log --oneline --graph --decorate C~..G
* 450d8f1 (tag: G) Merge pull request #320 ...
|\
| * 941935c Fix a few kbd / missing markdown issues/
| * f13dcf9 Upcase readme and have more prompt examples.
| * 57394c5 (tag: E) Now rename to README.md.
| * eb79ef2 Prepare to upcase README.md filename.
* | 536c57f Merge pull request #319 ...
|\ \
| |/
|/|
| * 7fafb7b Speed up Get-GitStatus
|/
* 2b9342c (tag: C) Merge pull request #313 ...
为了假装中间动作从未发生,我可以将replace
E
其父(E~
)和其祖父母(E~2
= C
):
$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
README1.md => README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Prepare to upcase README.md filename.
readme.md => README1.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
$ git replace E~ C
$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
readme.md => README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Merge pull request ...
最后,afilter-branch
将使更改永久生效:
$ git filter-branch -- ^C G E # For demo, only rewrite G & E afer C
$ git log --graph --oneline --decorate C~..G
* fcfd345 (tag: G) Merge pull request #320 ...
|\
| * fa76267 Fix a few kbd / missing markdown issues/
| * 4900687 Upcase readme and have more prompt examples.
| * b25aa5a (tag: E) Now rename to README.md.
* | 536c57f Merge pull request #319 ...
|\ \
| |/
|/|
| * 7fafb7b Speed up Get-GitStatus
|/
* 2b9342c (tag: C) Merge pull request #313 ...
为了您的目的,您将执行以下操作:
$ git replace E~ E~2
$ git replace 3~ 3~2
$ git filter-branch -- ^A --all
更新2:
我收到的提交消息来自E,我不在乎。我希望有D的提交消息(或提供的脚本消息)。
要保持D
的承诺元,我建议重新开始,并使用--commit-filter
指定E
的tree
(git cat-file -p E
)的D
(这E
应该是跳过),如
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = "SHA of D" ];
then
git commit-tree "TREE of E" -p "SHA of C";
elif [ "$GIT_COMMIT" = "SHA of E" ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi;
' -- ^A E G
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句