4

昨天我在我的 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 个其他分支离开 master。当我签出这些其他分支之一时,它会在我将文件夹移动到的新根文件夹级别的原始文件夹结构中签出我的存储库中的所有文件(大约 11,000 个).git

我该如何修复这个混乱?损害已经造成。在我运行之前我有一个.git文件夹的备份,filter-branch但是在这个备份完成之后我有提交,虽然不多,但足以保证在当前的 repo 上找到一个类似补丁的修复程序。我没有看到该filter-branch命令有任何明显的特定于分支的参数。

4

1 回答 1

3

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

运行 filter-branch 后,原始 refs 会在 refs/original 中备份(即 refs/original/master 在过滤之前是 master):对象仍然可用,我相信 reflogs 也保持完整,因此从bad filter-branch 操作相当简单。

所以你的选择是:

  • 通过签出 master 并执行以下操作来撤消 filter-branch 命令git reset --hard refs/original/master

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

于 2011-02-22T16:49:55.187 回答