Git filter-branch to remove trunk folder
我将我的SVN存储库迁移到了Git,但是由于某些原因,仍然存在主干文件夹,情况不应该如此。我想在不破坏历史记录行的情况下删除这些文件夹。
这是我目前拥有的Git存储库:
1 2 3 4 5 6 7 | - My repository -- Project1 --- trunk ---- src ---- somefile.txt ---- someotherfile.cpp ---- andanotherfile.cpp |
这就是我想要的:
1 2 3 4 5 6 | - My repository -- Project1 --- src --- somefile.txt --- someotherfile.cpp --- andanotherfile.cpp |
号
我知道命令过滤器分支是用来做这个的,但是除了这个和这个之外,我找不到一个适合我的例子,但是即使在那里,我也感到有点困惑,不确定是否应该尝试。有人碰到类似的事情,能确认这些是解决办法吗?
事先谢谢。
更新:所以我知道以下命令在大多数情况下都是用来执行操作的:
1 2 3 4 5 | git filter-branch --index-filter \ 'git ls-files -s | sed"s-/trunk/-/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"' HEAD |
实际上,我检查了sed行,它确实告诉我它将删除主干,并将里面的内容移动到上面的目录。但是,执行过程中出现以下错误:
1 | ../myrepository/.git-rewrite/t/../index.new': No such file or directory |
。
我不知道为什么会出现这个错误。我查了一下,似乎需要在这个命令中添加一个数字,在
所以,就这样。
执行魔法的命令是:
1 2 3 4 5 | git filter-branch -f --index-filter \ 'git ls-files -s | sed"s-/trunk/-/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"' af117ec86a30ba6676571cd1f73083c5cfbec0bd..HEAD |
号
注意在
要查找最早提交的提交标记,只需使用:
1 | git log |
尽可能向下滚动,您将看到最早的提交。取第二个或第三个。完成了。
克隆另一个repo进行测试
1 | git filter-branch --tree-filter 'cd Project1;cp trunk/* ./; rm -rf trunk' |