我正在将旧的svn repo导入git。有一次,在所有分支中重命名了一个文件夹。这是通过创建带有历史记录的副本在svn中完成的,然后在第二次提交时删除原始文件。所以我有一个看起来像这样的回购:
A -> B -> C -> D* -> E* -> F -> G -> H
\-> 1 -> 2* -> 3* - > 4 -/
D / E和2/3是我要压缩的提交。 压缩的原因是,虽然svn知道"重复历史记录",但git并没有将其视为重命名,因为原始文件在下次提交之前未被删除,我输了在这一点上责备历史。
我已尝试过一些可行的rebase脚本,但它们也会使我的所有分支都变得扁平化。以上是我必须要做的一个非常简化的版本,这就是为什么我真的需要脚本,因为我无法手动完成。在整个SVN回购历史中有超过1,000个分支机构,可能还有十几个并行分支机构,这些分支机构已完成此项更改(所有这些都在同一时间)。
git repo还没有发布,所以保持哈希是无关紧要的。我假设我需要使用一些过滤器分支脚本,但我仍然试图弄清楚如何管理我希望我可以在这里得到帮助。我可以提供需要压缩的每个提交的sha1及其父级。
答案 0 :(得分:2)
您希望使用for(xwingwaves = 0 ; xwingwaves < xwingwc ; xwingwaves += 1)
{
if(alarm[3] <= -1) alarm[3] = 500;
}
使用git filter-branch
将--parent-filter
的SHA的任何外观替换为D
的SHA。您还可以查看C
或git replace
,这可能比编写.git/info/grafts
更简单,并且可以使用--parent-filter
永久保留。
更新:正如@torek所说,你绝对应该使用git replace
。要使用现实生活中的示例,请执行从filter-branch
到readme.md
的重命名,并将中间重命名为README.md
:https://github.com/dahlbyk/posh-git/compare/dahlbyk:2b9342c...dahlbyk:57394c5。让我们致电README1.md
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~
= {{1 }}):
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 ...
出于您的目的,您将执行以下操作:
filter-branch
更新2 :
我得到的提交信息是E,我不在乎。我宁愿拥有D的提交消息(或脚本提供的消息)。
要保留$ 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
指定D
&#39; s --commit-filter
({ {1}} {}为E
(并且应该跳过tree
),例如
git cat-file -p E