在 Windows 上 GitHub 桌面上的子模块总是出现结帐错误
Always get checkout error with submodule on GitHub Desktop on Windows
我有一个包含几个分支的回购协议。在其中一个上,我删除了一个目录,该目录实际上并不属于回购协议,并将其作为 git 子模块添加回来。
我就是这么做的:
- 克隆存储库
- 切换到 GitHub Desktop
中带有子模块的分支
git submodule init
- 到现在为止我可以切换分支(在有子模块和没有子模块的分支之间没有任何问题)。
git submodule update
最终得到子模块"content"
所以一切正常,直到我尝试切换 GitHub 桌面中的分支(切换到另一个没有任何 git 子模块的分支)。如果我这样做,我会收到一个结帐错误,声称我有未提交的更改:
Failed to checkout the branch
The following files in your working
directory would be overwritten by a checkout: [...] Please commit
your changes before you can switch branches.
然而正如我所说我没有改变任何东西——我唯一做的就是更新我的子模块。
git status
表示一切正常:
$ git status
On branch patch-submodule
Your branch is up-to-date with 'origin/patch-submodule'.
nothing to commit, working directory clean
当我deinit
我的子模块时我也可以再次切换分支。
这里有什么问题吗?
我怎样才能防止或绕过这个错误?
您提到您从存储库中删除了一个目录,而是将其设为 git 子模块。
这个目录是否已从您尝试签出的分支中删除?
可能发生的情况是子模块包含与您尝试检出的分支中包含的相同文件之一。
您更新子模块,将文件放置在您的文件系统中。当您尝试签出该分支时,git 会尝试使用该特定分支上仍包含在主仓库中的版本覆盖该文件的子模块版本。 could/would 导致工作丢失,因此 git 抛出错误。
彻底检出该分支,然后删除文件并提交更改。也可能将子模块更改添加或合并到该分支。
感谢 GitHub 的支持,我终于得到了一个非常有用的回复。
特别是他们将我引导至 Replaced third party code with git submodules, now I can't switch branches,它准确描述了我的问题 - 除了一个区别:我确实使用了 GitHub GUI 而不是控制台。
还有一个链接 to git-scm,其中解释得非常好:
Switching branches with submodules in them can also be tricky. If you create a new branch, add a submodule there, and then switch back to a branch without that submodule, you still have the submodule directory as an untracked directory[.]
[...] You have to either move it out of the way or remove it, in which case you have to clone it again when you switch back—and you may lose local changes or branches that you didn’t push up.
这基本上就是我的错误消息的全部含义。
我有一个包含几个分支的回购协议。在其中一个上,我删除了一个目录,该目录实际上并不属于回购协议,并将其作为 git 子模块添加回来。
我就是这么做的:
- 克隆存储库
- 切换到 GitHub Desktop 中带有子模块的分支
git submodule init
- 到现在为止我可以切换分支(在有子模块和没有子模块的分支之间没有任何问题)。
git submodule update
最终得到子模块"content"
所以一切正常,直到我尝试切换 GitHub 桌面中的分支(切换到另一个没有任何 git 子模块的分支)。如果我这样做,我会收到一个结帐错误,声称我有未提交的更改:
Failed to checkout the branch
The following files in your working directory would be overwritten by a checkout: [...] Please commit your changes before you can switch branches.
然而正如我所说我没有改变任何东西——我唯一做的就是更新我的子模块。
git status
表示一切正常:
$ git status
On branch patch-submodule
Your branch is up-to-date with 'origin/patch-submodule'.
nothing to commit, working directory clean
当我deinit
我的子模块时我也可以再次切换分支。
这里有什么问题吗? 我怎样才能防止或绕过这个错误?
您提到您从存储库中删除了一个目录,而是将其设为 git 子模块。
这个目录是否已从您尝试签出的分支中删除?
可能发生的情况是子模块包含与您尝试检出的分支中包含的相同文件之一。
您更新子模块,将文件放置在您的文件系统中。当您尝试签出该分支时,git 会尝试使用该特定分支上仍包含在主仓库中的版本覆盖该文件的子模块版本。 could/would 导致工作丢失,因此 git 抛出错误。
彻底检出该分支,然后删除文件并提交更改。也可能将子模块更改添加或合并到该分支。
感谢 GitHub 的支持,我终于得到了一个非常有用的回复。
特别是他们将我引导至 Replaced third party code with git submodules, now I can't switch branches,它准确描述了我的问题 - 除了一个区别:我确实使用了 GitHub GUI 而不是控制台。
还有一个链接 to git-scm,其中解释得非常好:
Switching branches with submodules in them can also be tricky. If you create a new branch, add a submodule there, and then switch back to a branch without that submodule, you still have the submodule directory as an untracked directory[.]
[...] You have to either move it out of the way or remove it, in which case you have to clone it again when you switch back—and you may lose local changes or branches that you didn’t push up.
这基本上就是我的错误消息的全部含义。