我有一个带有单个子模块的超级项目。该子模块的开发完全独立于超级项目,但这不是我的超级项目的设置方式。目前,当子模块的来源更新时,如果某人(我)运行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;没有本地变化。
我做错了什么?
答案 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