在git中,为什么 `git submodule update --remote --recursive` 不起作用?

问题描述 投票:0回答:1

我正在构建 PX4 自动驾驶仪,当从一个版本更改为另一个版本时。我观察到以下现象:

peng@pop-os:~/git-fork/PX4-Autopilot$ git submodule update --remote --recursive --force --checkout
Submodule path 'Tools/simulation/flightgear/flightgear_bridge': checked out 'f47ce7b5fbbb3aa43d33d2be1f6cd3746b13d5bf'
Submodule path 'Tools/simulation/flightgear/flightgear_bridge/models/Rascal': checked out 'cbdb2fc7dd44331da1dcd04a891ed7f8c27b1ef0'
Submodule path 'Tools/simulation/flightgear/flightgear_bridge/models/TF-G1': checked out 'fdb6dd685f55097230c0eb29aa7e9f5b8d0abf1e'
Submodule path 'Tools/simulation/flightgear/flightgear_bridge/models/TF-G2': checked out 'adff544daf9cf8e0b2685006b4581140e2ce21b7'
Submodule path 'Tools/simulation/flightgear/flightgear_bridge/models/TF-R1': checked out '158e429a0110589b1e2adfe868e166271470e144'
Submodule path 'Tools/simulation/gazebo-classic/sitl_gazebo-classic': checked out '20ded0757b4f2cb362833538716caf1e938b162a'
Submodule path 'Tools/simulation/gazebo-classic/sitl_gazebo-classic/external/OpticalFlow': checked out '855b383e46ab352f8a318e1fa494a0baf082f749'
Submodule path 'Tools/simulation/gazebo-classic/sitl_gazebo-classic/external/OpticalFlow/external/klt_feature_tracker': checked out '9b5b567ae77f93d1ef4d36151529ba2506a46e7a'
Submodule path 'Tools/simulation/jmavsim/jMAVSim': checked out '66b764ada522893c05224950aa6268c809f8e48a'
Submodule path 'Tools/simulation/jmavsim/jMAVSim/jMAVlib': checked out 'c08380767b21938391bec676a43b36b837af9ba4'
Submodule path 'Tools/simulation/jsbsim/jsbsim_bridge': checked out '68de2cc63ded9a0d6641d45e9eb3ed2b43454cba'
Submodule path 'Tools/simulation/jsbsim/jsbsim_bridge/models/ATI-Resolution': checked out '40571cd808a204f4062128daeb6bb6db8c134c48'
Submodule path 'Tools/simulation/jsbsim/jsbsim_bridge/models/Rascal': checked out '6c2b8393ac69b6ae6b8e5588a28bc2facc5bba08'
Submodule path 'platforms/nuttx/NuttX/apps': checked out '616f7024a479bf209eadce133bba5dc8820a7f99'
Submodule path 'platforms/nuttx/NuttX/nuttx': checked out 'de41e7feaeffaec3ce65327e9569e8fdb553ca3d'
Submodule path 'src/drivers/cyphal/legacy_data_types': checked out '36a01e428b110ff84c8babe5b65667b5e3037d5e'
Submodule path 'src/drivers/cyphal/libcanard': checked out '73d0a9cae94307038344b0d3eac2fd6dac44e139'
Submodule path 'src/drivers/cyphal/public_regulated_data_types': checked out '935973babe11755d8070e67452b3508b4b6833e2'
Submodule path 'src/drivers/gps/devices': checked out 'b443b79f57c5e89353430940af9e4511ea8eb0b8'
Submodule path 'src/drivers/uavcan/libuavcan': checked out 'b798c6639e4407340d6f2768f5171dea9803d55c'
Submodule path 'src/drivers/uavcan/libuavcan/dsdl': checked out 'a34844772a11f53ce9bc49ace11b722179ae7fc7'
Submodule path 'src/drivers/uavcan/libuavcan/libuavcan/dsdl_compiler/pyuavcan': checked out '4a97cf45e4dd859b80364c279834e4a76d169694'
Submodule path 'src/lib/crypto/libtomcrypt': checked out '673f5ce29015a9bba3c96792920a10601b5b0718'
Submodule path 'src/lib/crypto/libtommath': checked out 'fd73d7630b9d3ed5a79d613ff680a549e9780de7'
Submodule path 'src/lib/crypto/monocypher': checked out 'baca5d31259c598540e4d1284bc8d8f793abf83a'
Submodule path 'src/lib/events/libevents': checked out '59f7f5c0ec2e76fadbc1dc40cc0705d614472edc'
Submodule path 'src/lib/events/libevents/libs/cpp/parse/nlohmann_json': checked out 'edffad036d5a93ab5a10f72a7d835eeb0d2948f9'
Submodule path 'src/modules/mavlink/mavlink': checked out '70181c42fc63306ba3512666e1a8b7b782416806'
Submodule path 'src/modules/mavlink/mavlink/pymavlink': checked out 'f508300142dcb313a95008a08e845b5acb192008'
Submodule path 'src/modules/uxrce_dds_client/Micro-XRCE-DDS-Client': checked out '711aef423edd1820347b866d1e4164832df35d04'
peng@pop-os:~/git-fork/PX4-Autopilot$ git status
On branch hpvdt-eval/dev2
Your branch is up to date with 'hpvdt/hpvdt-eval/dev2'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)
    modified:   Tools/simulation/flightgear/flightgear_bridge (modified content)
    modified:   Tools/simulation/gazebo-classic/sitl_gazebo-classic (new commits, modified content)
    modified:   Tools/simulation/jsbsim/jsbsim_bridge (modified content)
    modified:   platforms/nuttx/NuttX/apps (new commits)
    modified:   src/drivers/cyphal/libcanard (new commits)
    modified:   src/drivers/cyphal/public_regulated_data_types (new commits)
    modified:   src/drivers/gps/devices (new commits)
    modified:   src/drivers/uavcan/libuavcan (new commits, modified content)
    modified:   src/lib/events/libevents (new commits, modified content)
    modified:   src/modules/mavlink/mavlink (new commits, modified content)
    modified:   src/modules/uxrce_dds_client/Micro-XRCE-DDS-Client (new commits)

no changes added to commit (use "git add" and/or "git commit -a")


这似乎是自相矛盾的,因为

git submodule update --remote --recursive
应该自动将本地分支与远程分支同步。默认的 git 实现是否有错误或损坏?

git git-submodules
1个回答
0
投票

找到原因:看来

git submodule update
只能更改现状子模块提交中子模块中索引的文件,如果在新的子模块提交中添加/删除新的子模块/传递子模块,则不会更改。

这似乎是 git 的设计缺陷,因为它使子模块管理的无状态性大大降低。但可以使用一个简单的规避措施来强制丢弃未索引的部分:


git submodule sync && \
git submodule foreach git fetch && \
git submodule foreach git reset --hard && \
git submodule update --init --recursive --force
© www.soinside.com 2019 - 2024. All rights reserved.