git submodule:如何在不提交超级项目的情况下保持子模块的最新状态?

时间:2017-08-30 21:19:45

标签: git git-submodules

我有一个带有单个子模块的超级项目。该子模块的开发完全独立于超级项目,但这不是我的超级项目的设置方式。目前,当子模块的来源更新时,如果某人(我)运行git submodule update --recursive --remote并且然后将该更新提交到超级项目,则仅更新超级项目。那是愚蠢的;我没有在我的超级项目中跟踪子模块的任何版本或提交哈希值。我想要的只是在我的超级项目中拥有子模块的原点/主人,无论原点/主人是什么。我只想要同步子模块,不要将子模块提交到我的超级项目中。

例如,在执行git clone之后,为了获取子模块,我运行git submodule update --init --recursive并获取此信息:

$ git submodule update --init --recursive
Submodule 'scripts/token' (https://gitserver.company.com/token.git) registered for path 'scripts/token'
Submodule path 'scripts/token': checked out '93b6bee2031913f563f548883358a65a136bdd88'

但提交散列93b6bee2031913f563f548883358a65a136bdd88不是令牌仓库的原始/主人;那是< 0f39201818985d21a1f2362ad5b519793bd4f2b6。为了实现这一点,我运行了另一个git submodule命令:

$ git submodule update --recursive --remote
Cloning into '/Users/me/superproject/scripts/token'...
Submodule path 'scripts/token': checked out '0f39201818985d21a1f2362ad5b519793bd4f2b6'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

    modified:   scripts/token (new commits)

不,我没有&#34;新提交&#34;到超级项目;我刚刚同步了一个子模块。我希望这能像依赖一样工作;我想要token>=0.0.1(无论是什么是起源/主人),但看起来我所拥有的是token=explicit_commit_hash。我不想在我的超级项目中支持版本号或提交子模块令牌的哈希值。

更新:换句话说,如果git status说&#34;是最新的&#34;在运行git submodule update之前没有进行本地更改,然后在git submodule update更新子模块后,我仍然希望git status说出最新的&#34;没有本地变化。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我能想到的最接近的近似是使用克隆的别名,子模块更新远程克隆(surclone或任何你想要调用它的东西)。将以下内容添加到.gitconfig文件中。通过git config --global alias.surclone添加它将不起作用,因为shell将尝试解析参数。

surclone = "!f() { git clone --recursive ${1} . && git submodule update --remote --recursive --init; }; f"

您可以将命令扩展为自动提交(git commit --amend -a -m "Current master version of all submodules"),然后强制将其推送到服务器(git push -f)。这一切都要求在添加子模块时,还要指定要跟踪的分支,或稍后添加,例如.gitmodules

[submodule "SubmoduleA"]
    path = SubmoduleA
    url = git@github.com:some/repo.git
    branch = master