在工作树层次结构中向上移动.git文件夹

时间:2011-02-22 16:43:55

标签: git git-filter-branch

昨天我在git repo上执行了其中一项操作(请参阅下面的代码段),以便有效地将项目移动到文件夹层次结构中的几个文件夹中。这基本上列出了所有文件,并为它们添加了前缀文件夹名称,并相应地更新了索引。

旧布局:

+ Root
  - Sublevel 1
    - Sublevel 2
      - .git was here

新的,理想的布局:

+ Root
  - .git moved to here, so prefix all index files with "Sublevel 1/Sublevel 2/"
  - Sublevel 1
    - Sublevel 2

命令:

git filter-branch --index-filter '
    git ls-files -s | sed "s-\t-&newRoot/sub1/sub2/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
    ' HEAD

然而,这个命令,我不知道,只修改了master分支。我还有大约8个其他分支机构。当我签出其中一个分支时,它会检查我的仓库中的所有文件(大约11,000个),这些文件位于我将.git文件夹移动到的新根文件夹级别的原始文件夹结构中。

如何修复此问题?损坏已经完成。在我运行.git之前,我有filter-branch文件夹的备份,但是我在提交备份后提交,但不是很多,但足以保证在当前仓库中找到类似修补程序的修补程序。我没有看到filter-branch命令的任何明显的特定于分支的参数。

1 个答案:

答案 0 :(得分:3)

filter-branch将“仅重写命令行中提到的正引用”。所以你需要指定“--branches”来重写所有分支。你指定了HEAD,所以它只是改写了HEAD(即主人)

运行filter-branch后,原始引用以refs / original备份(即refs / original / master在过滤之前是master):对象仍然可用,我相信reflog也保持不变,所以从错误的过滤器分支操作中恢复是相当简单的。

所以你的选择是:

  • 通过签出master并执行git reset --hard refs/original/master

  • 来撤消filter-branch命令
  • 过滤其他分支,以便它们也被转换:重做filter-branch命令,但指定--branches --not master而不是HEAD,或者通过命名要修改的分支明确更安全