我正在将几个Subversion存储库迁移到Git,但它们的设置有点奇怪:标准的trunk/branches/tags结构位于存储库的几个子目录中。 / branches和/ tags都为空,因此git-svn导入最终只包含trunk目录。
svn/
proj1/
trunk/
src/
proj2/
trunk/
src/
我希望使用git filter-branch
命令删除额外的主干文件夹,但保留其余部分完整:
svn/
proj1/
src/
proj2/
src/
根据文档中的最后一个示例,我已经做到了这一点:
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
同样的修复方法最终起作用了。
git update-index
如果从git ls-files
得不到任何东西,实际上并不会创建索引文件;它似乎无法从空输入中生成空索引。 - Brian Campbell83df928c..HEAD
是否是您为此问题提出的命令的一部分,还是它是与您的问题非常特定相关的东西? - user4964330rm -rf .git-rewrite
命令,该命令会删除filter-branch
存储东西的临时文件夹。 - dahlbyk