git - 将带有子模块的项目的历史记录复制到现有的单个项目

发布于 2025-01-10 19:55:59 字数 107 浏览 0 评论 0 原文

我有一个 git 项目包含 10 个子模块项目。我将此项目作为单个项目迁移到另一个项目。 (现在所有子模块都只是新项目中的一个文件夹)

有没有办法将子模块中文件的历史数据迁移到新项目中?

I have a git project contains 10 submodules project. I migrated this project to another as a single project. (All submodules are just a folder in the new project now)

Is there anyway to migrate the history data of files in the submodules to new one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清浅ˋ旧时光 2025-01-17 19:56:00

对于每个子模块,您需要将其历史记录导入到主 Git 项目存储库中。

您在 2013 年文章“将子模块集成到父模块中”中有一个示例来自 Lucas Jenß 的存储库”。

我们的想法是在主父存储库旁边克隆子模块存储库:

•
├── parent/
└── sub/

删除父存储库中的子模块声明

git submodule deinit -f -- path/to/submodule
rm -rf .git/modules/path/to/submodule
git rm -f path/to/submodule

重写 < code>sub/ 存储库历史记录,以便将每个元素移动到正确的路径(父存储库中作为子模块的 path/to/submodule 路径)

但是,Lucas 正在使用一个(现在2022)旧的过时的 git filter-branch 命令,以便将每个子模块元素移动到父存储库中所需的路径:

CMD="git ls-files -s | sed \"s/${TAB}/${TAB}$TARGET_PATH\//\" | \
GIT_INDEX_FILE=\${GIT_INDEX_FILE}.new \
git update-index --index-info && mv \${GIT_INDEX_FILE}.new \${GIT_INDEX_FILE}"

它是有效的(但很麻烦,并且不能万无一失地应对极端情况,就像空提交)在 2013 年。
如今(2022 年),它是通过 git filter-repo (在 安装,因为它是基于 python 的)

cd sub
git filter-repo --to-subdirectory-filter path/to/submodule
# done!

最后,将历史记录合并到父历史记录中:

$ git remote add sub ../sub/
$ git fetch sub
$ git merge --allow-unrelated-histories --no-commit sub/master
Automatic merge went well; stopped before committing as requested

对所有 10 个子模块重复此操作。
您将获得一个单独的 Git 项目,其中保留了每个子模块的历史记录。

For each submodule, you would need to import their history into the main Git project repository.

You have an example in the 2013 article "Integrating a submodule into the parent repository" from Lucas Jenß.

The idea is to clone the submodule repository beside the main parent one:

•
├── parent/
└── sub/

Remove the submodule declaration in the parent repo:

git submodule deinit -f -- path/to/submodule
rm -rf .git/modules/path/to/submodule
git rm -f path/to/submodule

Rewrite the sub/ repository history in order to move each element to the right path (the path/to/submodule one it was in the parent repository as a submodule)

However, Lucas is using a (now 2022) old obsolete git filter-branch command in order to move each submodule element to the path it needs to have in the parent repository:

CMD="git ls-files -s | sed \"s/${TAB}/${TAB}$TARGET_PATH\//\" | \
GIT_INDEX_FILE=\${GIT_INDEX_FILE}.new \
git update-index --index-info && mv \${GIT_INDEX_FILE}.new \${GIT_INDEX_FILE}"

It was valid (but cumbersome and not fool-proofed against corner case, like empty commits) in 2013.
These days (2022), it is achieved with git filter-repo (after installation, as it is python-based)

cd sub
git filter-repo --to-subdirectory-filter path/to/submodule
# done!

Finally, merge the sub history into the parent one:

$ git remote add sub ../sub/
$ git fetch sub
$ git merge --allow-unrelated-histories --no-commit sub/master
Automatic merge went well; stopped before committing as requested

Repeat that for all 10 submodules.
And you get one single Git project, with each submodule history preserved.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文