昨天我在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
命令的任何明显的特定于分支的参数。
答案 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
命令,但指定--branches --not master
而不是HEAD,或者通过命名要修改的分支明确更安全