我正在将几个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
同样的修复最终奏效。
答案 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吗?