昨天,我在 git 存储库上执行了其中一项操作(请参阅下面的代码片段),以便有效地将我的项目向上移动文件夹层次结构中的几个文件夹。这基本上列出了所有文件并向它们添加前缀文件夹名称并相应地更新索引。
旧布局:
+ 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
Command:
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
但在进行此备份后我进行了提交,虽然数量不多,但足以保证在当前存储库上找到类似补丁的修复。我没有看到任何明显的特定于分支的参数filter-branch
命令。
过滤器分支将“仅重写命令行中提到的正面引用”。所以你需要指定“--branches”来重写所有分支。你指定了HEAD,所以它只是重写了HEAD(即master)
运行 filter-branch 后,原始引用将备份在 refs/original 中(即 refs/original/master 在过滤之前是 master):对象仍然可用,并且我相信引用日志也保持完整,因此从错误的过滤器分支操作相当简单。
所以你的选择是:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)