Git filter-branch删除trunk文件夹

时间:2016-05-17 09:01:58

标签: git git-filter-branch

我将我的svn存储库迁移到git,但由于某种原因,仍然存在trunk文件夹,但情况并非如此。我想在不损坏历史记录行的情况下删除这些文件夹。

这是我目前的git存储库:

- My repository
  -- Project1
     --- trunk
         ---- src
         ---- somefile.txt
         ---- someotherfile.cpp
         ---- andanotherfile.cpp

这就是我想要的:

- My repository
  -- Project1
     --- src
     --- somefile.txt
     --- someotherfile.cpp
     --- andanotherfile.cpp

我知道命令filter-branch用于此,但除了thisthis之外我找不到适合我的情况的例子,但是即便如此我感到有点困惑,不知道我是否应该尝试。任何人遇到类似的东西,可以确认那些是解决方案吗?

提前致谢。

更新:所以我知道大部分时间都使用以下命令来执行契约:

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行,它确实告诉我它将删除主干并移动内部的任何内容到上层目录。但是,执行给出了错误:

../myrepository/.git-rewrite/t/../index.new': No such file or directory

我不知道为什么会收到此错误。我查了一下,似乎我需要在HEAD之前加上这个命令,就像83df928c..HEAD一样。但是,我不知道这是为了什么(我的意思是,版本号,很可能,但为什么?)或者我的是什么。很感激帮助。几乎得到了它!

2 个答案:

答案 0 :(得分:0)

克隆另一个仓库以进行测试

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

答案 1 :(得分:0)

所以,就在这里。

执行魔术的命令是:

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之前的提交标记,该标记应该是您应输入的第二个或第三个最早的提交标记。如果输入第一个,则会出错。

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

git log

并尽可能向下滚动,在那里你会看到最早的提交。拿第二或第三。已经完成了。