git - 检查分支和子模块

时间:2017-03-13 10:02:51

标签: git deployment gitlab git-submodules webhooks

我可以使用哪些函数将所有子模块(本地存储库)同步/初始化/更新到远程分支中的版本?

“同步”(让我们称之为,我不是指git sync!)也必须在以下情况下工作:

  • 子模块仅添加到远程分支
  • 子模块中的文件已在本地添加/删除/修改。跟踪或未跟踪。
  • 删除子模块(可选)

基本上,我希望本地repo始终与远程分支完全相同。每当我改变子模块中的某些东西时,没有太多的摆弄。所以没有手动ssh'ing到服务器来初始化一个新的子模块,只有部署脚本才能工作......

这可以在没有克隆(也称为转移)整个存储库的情况下实现吗?我选择git来安全,快速地部署我的源代码。但我能想到的唯一选择是做一个完整的git clone --recursive并在下一个检查各自标签的子模块。在这种情况下,rsync可能会更好地同步文件。

2 个答案:

答案 0 :(得分:4)

git submodule update --init --recursive怎么样?它会将子模块更新为正确的提交,并在需要时对其进行初始化,并对所有子模块执行此操作,即使它们位于其他子模块中也是如此。如果不放弃更改,请先尝试git submodule foreach --recursive git reset --hard

答案 1 :(得分:0)

首先,在所需的位置和版本上手动添加和检出所需的子模块。要更新所有子模块,但保留在包含它们的仓库中检出的各自版本,可以使用

git submodule update --init --recursive --rebase --force

--rebase将导致git检出确切的提交,子模块在包含的repo中检出。

如果本地存储库对子模块文件进行了更改,则会失败,因此我们必须先重置所有子模块。对于脚本用法:

git submodule foreach 'git reset --hard && git checkout . && git clean -fdx'
git submodule update --init --recursive --rebase --force

重置命令直接来自git undo all uncommitted changes - 如果其他更适合此用例,请告诉我。

不需要额外的配置,只需检查子模块@ desired commit或tag并在包含的repo中推送该更改。

这些命令满足我的前两个初始要求:只要git跟踪子模块,所有更改都完全同步到"客户端"运行命令。如果删除了子模块,则可以在包含子模块的存储库上运行git clean以删除orohaned子模块文件。