filter-branch删除额外的目录

时间:2011-04-15 13:51:08

标签: git git-filter-branch

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

svn/
  proj1/
    trunk/
      src/
  proj2/
    trunk/
      src/

我想使用git filter-branch删除额外的trunk文件夹,但保留其余文件夹:

svn/
  proj1/
    src/
  proj2/
    src/

基于最后example in the documentation,这是我到目前为止所做的:

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正在完成它的工作,正如此输入:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/trunk/src/file1.txt

生成此输出:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/src/file1.txt

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

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"

有什么想法吗?我在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

同样的修复最终奏效。

2 个答案:

答案 0 :(得分:9)

根据评论here计算出来。 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

答案 1 :(得分:1)

嗯。我看不出你正在运行的是什么问题,它在我的示例存储库中运行正常:

$ git init
Initialized empty Git repository in /Users/bcampbel/tmp/git-subdir/.git/
$ mkdir -p proj1/trunk
$ echo "hello" > proj1/trunk/test.txt
$ git add .
$ git commit -m "initial commit"
[master (root-commit) cd431f3] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 proj1/trunk/test.txt
$ echo "foo" > proj1/trunk/another.txt
$ git add .
$ git commit -m "add a file"
[master 84139f2] add a file
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 proj1/trunk/another.txt
$ 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
Rewrite 84139f26c7921721190b3c5dd57e2b49a41034aa (2/2)
Ref 'refs/heads/master' was rewritten
$ ls proj1/
another.txt test.txt

由于某种原因,index.new文件似乎没有在您的系统上写出,或者mv命令无法读取。我不知道为什么会这样,但我想知道是否可能是因为你在Windows上使用msysgit。你有可以尝试的Linux机器或Mac吗?