如何解决 git subtree rev-parse split 问题

问题描述 投票:0回答:1

我正在使用 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 atlassian-sourcetree git-subtree
1个回答
0
投票

正如我之前所示,请确保使用 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
选项有助于清理和维护正确的历史记录。
如果其中一些操作在 SourceTree UI 中可能不可用或不直接,特别是
git subtree
的特定选项。您可能需要使用命令行来执行这些操作。

© www.soinside.com 2019 - 2024. All rights reserved.