自动将子模块版本填充到父模块

时间:2013-05-12 20:14:21

标签: git git-submodules

我正在使用git version 1.8.1.msysgit.1

运行Windows

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

1 个答案:

答案 0 :(得分:1)

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

假设您已经使用这样的子模块制作了回购:

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中的文件进行更改,但不要添加/提交它们。该文件将始终可用,因为当它与repo中其他地方的更改发生冲突时,您将修复它。它将匹配HEAD其余部分的内容。但是,你无法在任何地方回滚。该文件将保持最新,但您的回购历史记录无法正确跟踪特定时间的位置。

这是子模块的用法。您可以将整个子模块视为单个文件。无论发生什么变化,你的repo唯一关心的事情 - 它唯一允许关心的事情 - 就是你的回购所说的是子模块中当前的那个。它无法进入并使用特定文件执行操作,因此它所能做的就是跟踪整个子模块所处的提交,这就是它的作用。正如前面示例中的文件一样,您必须小心地将子模块保留在正确的提交中,并告诉您的repo哪个提交,或者您的历史记录无法正确了解将子模块转回的位置当你回到自己的回购中时。

您必须将其与其他文件一起添加/提交,以告知您的repo的历史记录“这是此子模块现在应该在哪里。”如果您这样做,那么您的仓库中的每个新提交都会在您的仓库中最后一次添加和提交仓库时重新添加。如果您将子模块向前移动一些提交,或者您提交了一些子模块提交,并且您希望这些新提交立即成为您的仓库历史记录的一部分,那么您需要在您的仓库中添加并提交子模块更新它认为是当前的提交。