2010-06-17 102 views
4

这里是我 - 我的代码一个混帐回购协议:如何更改git历史记录中的文件路径?

projects 
     |-proj1 (no git repo here yet) 
      |-subproj1 <- current git repo here 

这里是我想要的东西 - 一个git回购这是目前跟踪新项目,使用我的代码:

projects 
     |-proj1 <-git repo moved to here, but still tracking files in subproj1 
      |-subproj1 (no git repo here) 

我想保持历史记录不变,因此新的存储库将引用比原始文件更深一级的文件。什么是最痛苦的方式来做到这一点?

回答

10

重写历史可以与git filter-branch命令来完成。事实上,移动目录树成一个子目录是在git filter-branch手册页给出的剪切&糊现成的例子之一:

git filter-branch --index-filter ' 
    git ls-files -s | 
    sed "s-\t\"*-&subproj1/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE 
' HEAD 
+1

我正在尝试做类似的事情,并注意到我的临时索引文件没有写入(https://gist.github.com/60d14f45a0b2fb98e641)。会有什么合理的理由说明临时指数没有被写入? – 2010-09-06 05:41:19

+1

sed命令似乎是flakey;我没有得到预期的结果。 – mxcl 2011-10-11 16:53:32

+1

我也遇到了sed命令的问题。作为分隔符的'-'是不常见的,并且对名称中带有连字符的目录不可用。我使用:'sed“s#\ t \”*#&sub-proj1 /#“' – 2014-12-08 10:19:24

-1

只需在回购库中创建所需的目录结构 - 即将所有文件和文件夹移动到“subproj1”文件夹。

则阶段所有的添加和删除文件,git会制定出它们实际上是重命名:

git add . 
git add -u . 
git commit -m "Moved to a subfolder" 
+1

这将意味着,如果我签之前提交,文件将被内签出proj1。我不想那样。我希望能够检出以前的提交,并让subproj1中的文件受到影响。 – Carl 2010-06-17 02:55:42

相关问题