gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:41:50 24 4
gpt4 key购买 nike

昨天,我在我的 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

命令:

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

我该如何修复这个问题?损坏已经造成。在我运行 filter-branch 之前,我有一个 .git 文件夹的备份,但是我在这个备份完成后提交了,虽然不多,但足以保证找到一个补丁-like 修复当前的 repo 协议(protocol)。我没有看到 filter-branch 命令有任何明显的特定于分支的参数。

最佳答案

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

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

所以你的选择是:

  • 通过 check out master 并执行 git reset --hard refs/original/master

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

关于git - 在工作树层次结构中向上移动 .git 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com