我可以使用哪些函数将所有子模块(本地存储库)同步/初始化/更新到远程分支中的版本?
“同步”(让我们称之为,我不是指git sync!)也必须在以下情况下工作:
基本上,我希望本地repo始终与远程分支完全相同。每当我改变子模块中的某些东西时,没有太多的摆弄。所以没有手动ssh'ing到服务器来初始化一个新的子模块,只有部署脚本才能工作......
这可以在没有克隆(也称为转移)整个存储库的情况下实现吗?我选择git来安全,快速地部署我的源代码。但我能想到的唯一选择是做一个完整的git clone --recursive
并在下一个检查各自标签的子模块。在这种情况下,rsync可能会更好地同步文件。
答案 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子模块文件。