0

我正在用 git 运行 Windowsversion 1.8.1.msysgit.1

我有两个单独的存储库(例如 1 和 2,均由我维护),并且存储库 2 作为子模块(作为副本)添加到存储库 1。然后我更改子模块中的某些内容并推送到远程。如果我在远程检查子模块(repo 2)的版本作为单独的 repo,我会得到最新的哈希。但是,如果在远程检查子模块的版本,它仍然是旧的哈希。我不能自动化吗?(远程我是github)

4

1 回答 1

3

.gitmodules创建一个子模块只是通过and文件告诉 git .git/config,你的 repo 中的特定文件夹应该被视为一个单独的实体,它包含来自其他地方的整个其他 repo。您可以将整个文件夹视为与其他所有内容一起进行版本控制的文件,但您在存储库中实际版本控制的是该特定存储库所在的提交。

假设您已经使用这样的子模块创建了一个 repo:

git init (or clone) a repo
git submodule add otherrepo path/to/otherrepo

这是子模块的基本工作流程:

# either make some changes to the submodule yourself...
cd otherrepo
make some changes
git add --update .
git commit -m'Change some things'

# ...or pull some in from elsewhere
cd otherrepo
git pull

# now out in your repo, track those changes
cd ..
git add otherrepo
git commit -m'Point to latest commit in otherrepo'

让我们暂时忘记子模块。您可以更改存储库中的文件,但永远不要添加/提交它们。该文件将始终继续工作,因为当它违反 repo 中其他地方的更改时,您将对其进行修复。它将与其余部分中发生的情况相匹配HEAD。但是,您将无法在任何地方回滚。该文件将保持最新,但您的回购历史不会正确跟踪它在某些时间的位置。

这就是子模块的情况。您可以将整个子模块视为一个文件。无论提交到其中的更改是什么,您的 repo 唯一关心的事情 - 它唯一允许关心的事情 - 就是您的 repo 所说的提交是子模块中的当前提交。它无法进入并处理特定文件,因此它所能做的就是跟踪整个子模块在哪个提交上,这就是它的作用。但是,就像前面示例中的文件一样,您必须小心地将子模块保持在正确的提交位置,并告诉您的存储库是哪个提交,否则您的历史将无法正确知道将子模块回滚到哪里当您在自己的仓库中回到过去时。

您必须将它与其他文件一起添加/提交,以告知您的 repo 的历史“这是这个子模块现在应该在的位置”。如果您这样做,那么您的 repo 中的每个新提交都会重新添加到 repo 上次在您的 repo 中添加和提交的位置。如果您将子模块向前移动几个提交,或者如果您拉入一些子模块提交,并且您希望这些新提交现在成为您的回购历史的一部分,那么您需要在您的回购中添加并提交子模块到更新它认为是当前的提交。

于 2013-05-12T23:15:12.643 回答