Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git-签出分支和子模块_Git_Deployment_Gitlab_Git Submodules_Webhooks - Fatal编程技术网

git-签出分支和子模块

git-签出分支和子模块,git,deployment,gitlab,git-submodules,webhooks,Git,Deployment,Gitlab,Git Submodules,Webhooks,我可以使用哪些函数将所有子模块(本地repo)同步/初始化/更新到远程分支中的版本 “同步”(我们这么说吧,我不是说git Sync!)在以下情况下也必须工作: 子模块仅添加到远程分支 子模块中的文件已在本地添加/删除/修改。追踪的或未追踪的 子模块已删除(可选) 本质上,我希望本地repo始终与远程分支处于完全相同的版本。每当我在子模块中更改某些内容时,都不会进行太多的修改。因此,不需要手动ssh到服务器来初始化新的子模块,只需要让部署脚本工作 在不克隆(又称传输)整个存储库的情况下可以实

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

“同步”(我们这么说吧,我不是说git Sync!)在以下情况下也必须工作:

  • 子模块仅添加到远程分支
  • 子模块中的文件已在本地添加/删除/修改。追踪的或未追踪的
  • 子模块已删除(可选)
本质上,我希望本地repo始终与远程分支处于完全相同的版本。每当我在子模块中更改某些内容时,都不会进行太多的修改。因此,不需要手动ssh到服务器来初始化新的子模块,只需要让部署脚本工作


在不克隆(又称传输)整个存储库的情况下可以实现这一点吗?我选择git是为了有一种安全、快速的方式来部署我的源代码。但我能想到的唯一选择是,做一个完整的
git克隆--recursive
,然后在它们各自的标签上签出子模块。在这种情况下,rsync可能会在同步文件方面做得更好。

那么
git子模块更新--init--recursive
呢?它会将子模块更新为正确的提交,在需要时对其进行初始化,并对所有子模块执行此操作,即使它们位于其他子模块内。如果这并没有放弃更改,请首先尝试使用
git子模块foreach--recursive git reset--hard

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

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

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
重置命令直接取自 -让我知道是否还有其他更适合这个用例的东西

不需要额外的配置,只需签出子模块@desired commit或标记,并将更改推送到包含的repo中


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

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

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
重置命令直接取自 -让我知道是否还有其他更适合这个用例的东西

不需要额外的配置,只需签出子模块@desired commit或标记,并将更改推送到包含的repo中


这些命令满足了我最初的两个要求:只要git跟踪子模块,所有更改都会完全同步到运行这些命令的“客户机”。如果删除了一个子模块,
git clean
可以在包含子模块的存储库上运行,以删除或修改子模块文件。

每个子模块也都是自己的存储库,因此,考虑到具有三个子模块S0、S1、S2的顶级存储库R,您需要担心四个存储库。但是,存储库的成本并不像分支库那么低,但如果使用引用克隆,仍然相当便宜。尽管如此,子模块仍然是一个棘手的问题。:-)每个子模块也都是自己的存储库,因此给定具有三个子模块S0、S1、S2的顶级存储库R,您需要担心四个存储库。但是,存储库的成本并不像分支库那么低,但如果使用引用克隆,仍然相当便宜。尽管如此,子模块仍然是一个棘手的问题。:-)我在deploy分支中签出了一个子模块@v1,并推送了它。git子模块update--init--recursive可以工作,但是当我在推送到子模块repo之后,在标记v1之后再次运行它时,子模块update也会产生这种变化。您可以详细说明您想要发生什么以及实际发生了什么吗?你在哪里提交了什么?子模块发生了什么?嗯,我的评论没有发布。。。我现在已经解决了这个问题,子模块的
HEAD
git子模块更新--init--recursive
之后是@code
v2
,但是它应该是@code>v1,在myrepo中签出的版本。下面是我的答案。我在deploy分支中签出了一个子模块@v1,并按下按钮。git子模块update--init--recursive可以工作,但是当我在推送到子模块repo之后,在标记v1之后再次运行它时,子模块update也会产生这种变化。您可以详细说明您想要发生什么以及实际发生了什么吗?你在哪里提交了什么?子模块发生了什么?嗯,我的评论没有发布。。。我现在已经解决了这个问题,子模块的
HEAD
git子模块更新--init--recursive
之后是@code
v2
,但是它应该是@code>v1,在myrepo中签出的版本。这是我问题的最终正确答案。“--rebase--force”是的,这就是我的问题的最终正确答案。"