重写子模块的历史记录后,带有子模块的存储库

恩佐

用重写存储库的历史记录后git filter-branch,所有SHA都会更改。

现在,如果该存储库(我们称之为X)用作另一个存储库(我们称之为Y)中的git子模块,我们就会遇到问题。
实际上,基于该子模块中提交的SHAY知道X要加载哪个版本的子模块。由于X现在所有的SHA都已更改,因此Y指向不再存在的SHA。

有没有办法重写历史记录Y,使其指向子模块的新提交SHA X(当前和过去的提交)?

我猜想,鉴于旧的SHA和新的SHA之间存在对应关系,从原则上讲这是可能的,但是我担心它会涉及讨厌的bash脚本。
有什么容易的吗?

VonC

但恐怕会涉及讨厌的bash脚本。

恐怕是的。

有什么容易的吗?

从来没听说过。
以下是该脚本工作所需的一些线索(不是完整的脚本):

如果您仍然有权访问重写的存储库,则其原始历史记录(过滤分支之前)将保留在中.git/refs/original

这意味着您可以循环使用该旧历史记录SHA1:

 git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original

如果更改仅限于一个分支,则可以轻松地将新的SHA1与旧的SHA1匹配(第一个旧的SHA1匹配重写的分支的第一个提交,第二个旧的与匹配的分支,依此类推)

如果不是,则必须寻找转速才能找到匹配项(相同的日期,合理的提交消息)

git rev-list --all \
  | while read commit
 do
 ...

确保父仓库更新其对子模块的引用:

cd parent/repo
cd asubmodule
git fetch

这样,新的SHA1就可以使用了。

最后,你可以做一个过滤器分支父回购,寻找gitlink在索引特殊项,老SHA1的配套之一。

对于每个匹配项,您都需要在子模块文件夹中检出新的SHA1,返回上一级到父存储库,然后添加并提交:这将记录一个新的gitlink SHA1。

cd parent/repo/asubmodule
git checkout <new SHA1>
cd ..
git add .
git commit -m "Record new SHA1 for asubmodule"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重写子模块的 git 历史记录后更新对父存储库中子模块的引用

来自分类Dev

在分支上重写历史记录后的 Git 存储库大小

来自分类Dev

在不积累更新历史记录的情况下将子模块更新为最新版本

来自分类Dev

克隆包含带有本地分支的子模块的本地Git存储库

来自分类Dev

带有子模块的Xcode推送工作区在推送时存储库错误

来自分类Dev

克隆包含带有本地分支的子模块的本地Git存储库

来自分类Dev

从存储库中删除所有Git缓存的子模块

来自分类Dev

推送包含子模块的分叉存储库

来自分类Dev

通过删除除“ foo”和“ bar”以外的所有文件来重写git存储库历史记录

来自分类Dev

如何更新谁的历史被重写的git子模块

来自分类Dev

带有子模块导入的名称空间

来自分类Dev

带有子模块的 Angular 4 路由

来自分类Dev

带有子模块的木偶运行阶段

来自分类Dev

“ git squash”(推送后)是否重写历史记录?

来自分类Dev

我用--depth 1克隆存储库后如何获取所有git历史记录?

来自分类Dev

子模块分叉的存储库获取父存储库的分支

来自分类Dev

重写历史记录后,Git没有正确推动

来自分类Dev

如何将带有子模块的git存储库合并到带有子树合并的另一个存储库中?

来自分类Dev

从拆分存储库还原git历史记录

来自分类Dev

从庞大的Git存储库中删除历史记录

来自分类Dev

清除XCode中存储库的历史记录列表

来自分类Dev

合并缺少提交历史记录的git存储库到保留历史记录的存储库

来自分类Dev

合并缺少提交历史记录的git存储库到保留历史记录的存储库

来自分类Dev

将远程存储库导入为具有完整历史记录的子目录

来自分类Dev

将git存储库推送到具有历史记录的远程颠覆

来自分类Dev

隐藏具有完整历史记录的合并2存储库

来自分类Dev

如何将具有完整历史记录的扩散存储库导入github?

来自分类Dev

我可以重写整个git存储库的历史记录以包含我们忘记的内容吗?

来自分类Dev

将git子模块合并到主存储库中

Related 相关文章

  1. 1

    重写子模块的 git 历史记录后更新对父存储库中子模块的引用

  2. 2

    在分支上重写历史记录后的 Git 存储库大小

  3. 3

    在不积累更新历史记录的情况下将子模块更新为最新版本

  4. 4

    克隆包含带有本地分支的子模块的本地Git存储库

  5. 5

    带有子模块的Xcode推送工作区在推送时存储库错误

  6. 6

    克隆包含带有本地分支的子模块的本地Git存储库

  7. 7

    从存储库中删除所有Git缓存的子模块

  8. 8

    推送包含子模块的分叉存储库

  9. 9

    通过删除除“ foo”和“ bar”以外的所有文件来重写git存储库历史记录

  10. 10

    如何更新谁的历史被重写的git子模块

  11. 11

    带有子模块导入的名称空间

  12. 12

    带有子模块的 Angular 4 路由

  13. 13

    带有子模块的木偶运行阶段

  14. 14

    “ git squash”(推送后)是否重写历史记录?

  15. 15

    我用--depth 1克隆存储库后如何获取所有git历史记录?

  16. 16

    子模块分叉的存储库获取父存储库的分支

  17. 17

    重写历史记录后,Git没有正确推动

  18. 18

    如何将带有子模块的git存储库合并到带有子树合并的另一个存储库中?

  19. 19

    从拆分存储库还原git历史记录

  20. 20

    从庞大的Git存储库中删除历史记录

  21. 21

    清除XCode中存储库的历史记录列表

  22. 22

    合并缺少提交历史记录的git存储库到保留历史记录的存储库

  23. 23

    合并缺少提交历史记录的git存储库到保留历史记录的存储库

  24. 24

    将远程存储库导入为具有完整历史记录的子目录

  25. 25

    将git存储库推送到具有历史记录的远程颠覆

  26. 26

    隐藏具有完整历史记录的合并2存储库

  27. 27

    如何将具有完整历史记录的扩散存储库导入github?

  28. 28

    我可以重写整个git存储库的历史记录以包含我们忘记的内容吗?

  29. 29

    将git子模块合并到主存储库中

热门标签

归档