我正在使用 SourceTree 与分支交互。 另外,我的 git 知识极其有限
我有一个 NAV-482 分支(/nav.git 存储库)。子树分支是NAV-482-DLL(/nav.dll.git存储库)。子树名称(和本地相对路径)是 nav.dll
当我可以毫无问题地从子树中提取更改时,我遇到了问题,但是当我尝试将更改推送到子树中时,我失败并出现以下错误:
git push using: nav.dll.git NAV-482-DLL
fatal: remote error: upload-pack: not our ref 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd
fatal: the remote end hung up unexpectedly
fatal: could not rev-parse split hash 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd from commit 872b637c702ca5f45b41bdecbded976b47313b23
跳转到提交 872b637c702ca5f45b41bdecbded976b47313b23 显示这个提交是从 2017 年回来的,其中 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd 是 git-subtree-split
不知道为什么push突然选择那样死掉,但现在这是一个问题。
根据我对这个问题的了解,可能有多种解决方案:
Git 推送子树失败未知修订版或路径,可能是由于缺少 git-subtree-split 提交 建议使用
git fetch <subtree rep> <hash>
来获取有问题的提交。不幸的是它失败了:
$ git fetch nav.dll.git 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd
fatal: remote error: upload-pack: not our ref 4fb3fa1d8661a6294e798912d39f3ffbbe60a9dd
fatal: the remote end hung up unexpectedly
据我了解,这意味着此提交不再位于存储库中
删除无效的 git-subtree-split hash 建议使用
git subtree split --ignore-joins --rejoin
,人们似乎设法解决了问题。
这个我不愿意尝试,因为说实话,我直接不明白这个命令会做什么。 据我了解,它应该看起来像
git subtree split -P NAV-482-DLL --ignore-joins --rejoin -b NAV-482-TEMP
,但预期结果到底是什么?它会创建一个单独的分支,还是会提交到当前签出的 NAV-482 分支?
这是解决 SourceTree UI 问题的方法吗?如果没有,正确的 git subtree split 命令应该如何查看,或者我应该寻求其他解决方案?
正如我之前所示,请确保使用 Git 2.39+(其中包括错误修复)。并考虑对您的存储库进行备份,以防止任何数据意外丢失。
确保您位于主存储库 (
NAV-482
) 中的正确分支 (/nav.git
)。
git switch NAV-482
执行
git subtree split
命令重新创建子树历史记录。git subtree split -P NAV-482-DLL --ignore-joins --rejoin -b NAV-482-TEMP
-P NAV-482-DLL
:指定子树的前缀(路径)。--ignore-joins
:忽略先前子树合并创建的连接提交。--rejoin
:在分割后创建一个新的连接提交。-b NAV-482-TEMP
:使用分割子树创建一个新分支。该命令将在您的主存储库中创建一个新分支 (
NAV-482-TEMP
),其中包含对子树所做的更改的历史记录。
将新创建的分支推送到子树存储库。
git push nav.dll.git NAV-482-TEMP:NAV-482-DLL
git subtree split
本质上提取子文件夹的历史记录(在您的情况下,nav.dll
)并将其放入新分支中。 --ignore-joins
和 --rejoin
选项有助于清理和维护正确的历史记录。git subtree
的特定选项。您可能需要使用命令行来执行这些操作。