如何在从SVN创建的GIT存储库中移动文件并保留历史记录?

时间:2015-05-12 16:24:29

标签: git git-svn

我正在将项目从SVN转移到GIT。设置项目时,软件的每个组件都放入其自己的主干,标签和分支目录集中。我们希望从这个多SVN存储库方案转移到单个GIT存储库。

我相信我有一个脚本可以从SVN克隆到多个GIT存储库。至少所有的历史,分支和标签都在GIT内部。有一个问题,文件并没有真正位于适当的位置,因此将它们合并到一个存储库中并保持历史记录并不容易。

为了更详细,我们有一个目录结构,如:

root
  |-->demo
      |--> demo1
            |-->branches
            |-->tags
            |-->trunk
               -- file 1
               -- file 2
      |--> demo2
            |-->  <same as above>
  |-->Source
      |--> Package A
            |-->  <same as above>
      |--> Package B
            |-->  <same as above>

我以下的程序:

  1. 创建项目目录树
  2. git svn clone到每个目录
  3. 将所有分支机构设为本地
  4. 然后我尝试了以下内容:

    1. git init一个新的存储库
    2. 对于上面的每个存储库

      • git remote add -f上面创建的所有存储库
      • git与--no-commit --no-ff
      • 合并
      • git read-tree,其中--prefix =到文件所在的位置
      • git commit that that
    3. 所有文件都显示在正确的目录中。 git log 将显示从SVN获取的整个存储库的所有历史记录。但 git log filename 仅显示最新的提交,因此它已丢失了与主日志的链接,因为所有内容都已移动。此外,所有分支仍然将其文件放在基本目录中,因此当我执行 git checkout 时,我的树的其余部分将消失,所有这些文件都是其中的一部分分支来自的存储库。

      我也尝试过:

      1. git mv 每个文件但我得到的结果与上面相同
      2. 我认为我应该做的是:

        1. 对于每个存储库

          • git filter-branch使用 git help filter-branch 中的示例来更改子目录。例如:

          〜/ root / demo / demo1 $ git filter-branch --index-filter&#39; git ls-files -s | sed&#34; s- \ t \&#34; * - &amp; root / demo / demo1 / - &#34; |     GIT_INDEX_FILE = $ GIT_INDEX_FILE.new \     git update-index --index-info&amp;&amp;     mv&#34; $ GIT_INDEX_FILE.new&#34; &#34; $ GIT_INDEX_FILE&#34;&#39; HEAD

          重写821c68304e6521b851903463387c1fcccb34958a(1/635)mv:无法统计'root / demo / demo1 / .git-rewrite / t /../ index.new':没有这样的文件或目录 索引过滤器失败:git ls-files -s | sed&#34; s- \ t \&#34; * - &amp; software / root / bsp / - &#34; |     GIT_INDEX_FILE = $ GIT_INDEX_FILE.new \     git update-index --index-info&amp;&amp;     mv&#34; $ GIT_INDEX_FILE.new&#34; &#34; $ GIT_INDEX_FILE&#34;

        2. 它引发了关于.git-rewrite / t /../ index.new文件不存在的错误。

          当我尝试使用两个测试GIT存储库执行相同的操作时,它可以正常工作。我试图克隆存储库,希望可以解决问题,但它没有帮助。所以我的问题是:

          如何移动从SVN创建的GIT存储库?我是否正确地从SVN创建GIT存储库?有没有更好的方法来获取所有这些小型SVN存储库并将它们合并到一个GIT存储库中?

          补充说明 git update-index git filter-branch 具体做什么?在这种情况下?我可以将它们分成我脚本中的其他步骤,以便我可以解决我遇到的问题吗?我想我特别要问的是什么设置 GIT_INDEX_FILE 以及它将它设置为什么?

          如果有任何帮助,我正在运行git 1.9.1。

1 个答案:

答案 0 :(得分:0)

我在这里找到了一个解决方案:

error combining git repositories into subdirs

示例git命令似乎存在某种问题。