Git filter-branch删除trunk文件夹

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

我不知道为什么会出现这个错误。我查了一下,似乎需要在这个命令中添加一个数字,在HEAD之前,就像83df928c..HEAD一样。然而,我不知道这是为了什么(我的意思是,修订号,很可能,但为什么?)或者什么是我的。非常感谢你的帮助。快到了!


所以,就这样。

执行魔法的命令是:

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

注意在..HEAD之前的commit标签,它应该是您应该输入的第二个或第三个最早的commit标签。如果输入第一个,则会出现错误。

要查找最早提交的提交标记,只需使用:

1
git log

尽可能向下滚动,您将看到最早的提交。取第二个或第三个。完成了。


克隆另一个repo进行测试

1
git filter-branch --tree-filter 'cd Project1;cp trunk/* ./; rm -rf trunk'