微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

filter-branch删除多余的目录

如何解决filter-branch删除多余的目录

| 我正在将几个Subversion存储库迁移到Git,但它们的设置有点怪异:标准的主干/分支/标签结构位于该存储库的多个子目录中。 / branches和/ tags都是空的,因此git-svn导入仅以主干目录结尾。
svn/
  proj1/
    trunk/
      src/
  proj2/
    trunk/
      src/
我想使用ѭ1删除多余的中继文件夹,但其余部分保持不变:
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
在我看来,ѭ4正在完成其工作,如下所示:
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,类似的情况会产生不同的错误(注意在执行命令之前before8ѭ不存在):
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-svn如何表示\“ empty \”(仅目录)提交似乎是一个问题。如果我从正常提交开始就可以正常工作:
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
    ,嗯我看不到您所运行的内容有什么问题,它在示例存储库中对我来说很好用: $ git init 在/Users/bcampbel/tmp/git-subdir/.git/中初始化了空的Git存储库 $ mkdir -p proj1 / trunk $ echo \“ hello \”> proj1 / trunk / test.txt $ git添加。 $ git commit -m \“初始提交\” [master(root-commit)cd431f3]初始提交  更改1个文件,1个插入(+),0个删除(-)  创建模式100644 proj1 / trunk / test.txt $ echo \“ foo \”> proj1 / trunk / another.txt $ git添加。 $ git commit -m \“添加文件\” [master 84139f2]添加文件  更改1个文件,1个插入(+),0个删除(-)  创建模式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 重写84139f26c7921721190b3c5dd57e2b49a41034aa(2/2) Ref \'refs / heads / master \'被重写 $ ls proj1 / another.txt test.txt 似乎由于某种原因,
index.new
文件未在系统上写出,或者ѭ12by命令无法读取。我不确定为什么会这样,但是我想知道是否可能是由于您在Windows上使用了msysgit。您是否有可以试用的Linux盒子或Mac?     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。