filter-branch删除额外的目录

dah*_*byk 10 git git-filter-branch

我正在将几个Subversion存储库迁移到Git,但它们设置有点奇怪:标准的trunk/branches/tags结构存在于存储库的几个子目录中./ branches和/ tags都是空的,因此git-svn导入最终只有trunk目录.

svn/
  proj1/
    trunk/
      src/
  proj2/
    trunk/
      src/
Run Code Online (Sandbox Code Playgroud)

我想git filter-branch用来删除额外的trunk文件夹,但保持其余部分完整:

svn/
  proj1/
    src/
  proj2/
    src/
Run Code Online (Sandbox Code Playgroud)

基于文档中的最后一个示例,这是我到目前为止所拥有的:

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
Run Code Online (Sandbox Code Playgroud)

在我看来,它sed正在做它的工作,因为这个输入:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/trunk/src/file1.txt
Run Code Online (Sandbox Code Playgroud)

生成此输出:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/src/file1.txt
Run Code Online (Sandbox Code Playgroud)

但是,当我运行整个命令时,我收到以下错误:

Rewrite e00c119cfb755f741dc0e17c36d36bc2ddd27562 (1/42)mv: cannot stat `/c/dev/R
epo/.git-rewrite/t/../index.new': No such file or directory
index filter failed: 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"
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我在Windows上使用git版本1.7.3.1.msysgit.0.

更新:现在使用git版本1.9.0.msysgit.0,类似的情况会产生不同的错误(.git-rewrite在执行命令之前不存在注释):

rm: cannot remove `c:/Path/to/svn/.git-rewrite/revs': Permission denied
rm: cannot remove directory `c:/Path/to/svn/.git-rewrite': Directory not empty
Run Code Online (Sandbox Code Playgroud)

同样的修复最终奏效了.

dah*_*byk 9

根据这里的评论想出来.git-svn如何表示"空"(仅限目录)提交似乎是一个问题.如果我从正常提交开始,它工作正常:

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"' 83df928c..HEAD
Run Code Online (Sandbox Code Playgroud)