如何将子模块设置为指向特定提交而不获取它?
How can I set a submodule to point to a specific commit without fetching it?
我正在编写一个服务来更新超级项目中每个子模块指向的提交。我天真的做法是 运行 git fetch
在子模块 git reset --hard <hash>
中,然后添加子模块并提交它。
我想跳过 git fetch
步骤并简单地强制子模块指向给定的哈希以获得更好的性能(跳过获取对象和占用磁盘 space)并处理提交可能不再存在于上游并且无论如何都无法获取(如果它们被强制推送破坏)。
解决方法是直接写入Git索引,其实对于子模块来说很简单。用 Git 2:
git update-index --cacheinfo 160000,<Git hash of the submodule's tree>,<path to the submodule>
例如,如果您的项目目录结构如下所示:
.
├── .git
└── submodule
然后更新子模块以指向提交 2764a900748fbed7453f5839cb983503cee346d2 你会 运行:
git update-index --cacheinfo 160000,2764a900748fbed7453f5839cb983503cee346d1,submodule
最后像往常一样用 git commit
跟进。
我正在编写一个服务来更新超级项目中每个子模块指向的提交。我天真的做法是 运行 git fetch
在子模块 git reset --hard <hash>
中,然后添加子模块并提交它。
我想跳过 git fetch
步骤并简单地强制子模块指向给定的哈希以获得更好的性能(跳过获取对象和占用磁盘 space)并处理提交可能不再存在于上游并且无论如何都无法获取(如果它们被强制推送破坏)。
解决方法是直接写入Git索引,其实对于子模块来说很简单。用 Git 2:
git update-index --cacheinfo 160000,<Git hash of the submodule's tree>,<path to the submodule>
例如,如果您的项目目录结构如下所示:
.
├── .git
└── submodule
然后更新子模块以指向提交 2764a900748fbed7453f5839cb983503cee346d2 你会 运行:
git update-index --cacheinfo 160000,2764a900748fbed7453f5839cb983503cee346d1,submodule
最后像往常一样用 git commit
跟进。