Git 没有额外重量的子模块
Git submodule without extra weight
我还不是 Git 大师,遇到了一个我不知道如何解决的问题。我有一个带有我的 WordPress 自定义框架的存储库,并且我已经通过 git submodule add wp_repo_url
从其原始存储库中将 WordPress 添加为子模块。当我使用以下命令将我的存储库克隆到本地计算机时:
git clone --recursive https://github.com/user/repo local_dir
它按预期下载了 WP 子模块,但问题是 - 实际文件只有 20.7Mb,在 .git/modules/core/objects/pack
中我有一个巨大的 124Mb .pack 文件,我想这是 smth比如那个子模块的提交历史/修订。
如何在克隆时重新添加子模块或修改以防止下载这个额外的权重?
更新:
在@iclmam 的帮助下,我想出了以下设置:
- 我的骨架回购将 WordPress 作为子模块,整个原始回购具有历史记录
- 当从骨架创建一个新项目时,我将在不使用 --recursive 选项的情况下克隆它以仅获取主文件和子模块的空文件夹
- IF 我需要具有完整历史记录的 WordPress - 例如,如果我需要在不同的 WP branches/tags 之间切换以测试我的 plugin/theme 向后兼容性 -然后我会得到这个具有完整历史记录的子模块
如果我只需要一个全新的最新 WP 版本安装,我将切换到 wp 目录并使用旧方法:
curl -L -O http://wordpress.org/latest.zip
unzip latest.zip
mv wordpress/* .
rm latest.zip
rm -rf wordpress
这不是一个完美的解决方案(我想尽可能地自动化所有事情),但它现在有效。
如有任何关于原始问题的建议,我们将不胜感激。
如果您将 WP 用作子模块,这意味着您可能需要访问该子模块内的历史记录。这意味着您需要这个包文件。
Git 将数据打包到打包文件中。这是为了提高效率和节省磁盘 space 的目的。参见 Git internal - Packfiles . If you wonder what is in the packfile, you can use the git verify-pack command。与 -v 选项一起使用,您可能会发现一个巨大的文件已放入您的存储库中。
如果出于某些原因你想 'clean' 子模块,我建议你阅读 Why is my repo so big ?
如果你不想要子模块中的完整历史,你可以尝试使用 -depth 选项克隆它(参见 git submodule command),这样它就是一个历史被截断的浅克隆。这可能会减小包文件夹的大小。
1) 在没有递归选项的情况下克隆主仓库
2) 在主仓库中,使用带有 -depth 选项的 git 子模块命令初始化子模块
自 Git 2.10+(2016 年第 3 季度)起,您将能够进行常规克隆...并且仍然受益于 子模块的浅层克隆。
您需要做的就是在 .gitmodules
:
中记录该配置
git config -f .gitmodules submodule.<name>.shallow true
添加、提交和推送:任何克隆您的存储库(常规克隆、完整历史记录)的人都只会获得子模块的深度 1 <name>
。
参见 commit f6fb30a, commit abed000 and commit 37f52e9 (03 Aug 2016) by Stefan Beller (stefanbeller
)。
(由 Junio C Hamano -- gitster
-- in commit dc7e09a 合并,2016 年 8 月 8 日)
> submodule update
: 学习 --[no-]recommend-shallow
选项
Sometimes the history of a submodule is not considered important by the projects upstream. To make it easier for downstream users, allow a boolean field 'submodule.<name>.shallow
' in .gitmodules
, which can be used to recommend whether upstream considers the history important.
This field is honored in the initial clone by default, it can be ignored by giving the --no-recommend-shallow
option.
我还不是 Git 大师,遇到了一个我不知道如何解决的问题。我有一个带有我的 WordPress 自定义框架的存储库,并且我已经通过 git submodule add wp_repo_url
从其原始存储库中将 WordPress 添加为子模块。当我使用以下命令将我的存储库克隆到本地计算机时:
git clone --recursive https://github.com/user/repo local_dir
它按预期下载了 WP 子模块,但问题是 - 实际文件只有 20.7Mb,在 .git/modules/core/objects/pack
中我有一个巨大的 124Mb .pack 文件,我想这是 smth比如那个子模块的提交历史/修订。
如何在克隆时重新添加子模块或修改以防止下载这个额外的权重?
更新:
在@iclmam 的帮助下,我想出了以下设置:
- 我的骨架回购将 WordPress 作为子模块,整个原始回购具有历史记录
- 当从骨架创建一个新项目时,我将在不使用 --recursive 选项的情况下克隆它以仅获取主文件和子模块的空文件夹
- IF 我需要具有完整历史记录的 WordPress - 例如,如果我需要在不同的 WP branches/tags 之间切换以测试我的 plugin/theme 向后兼容性 -然后我会得到这个具有完整历史记录的子模块
如果我只需要一个全新的最新 WP 版本安装,我将切换到 wp 目录并使用旧方法:
curl -L -O http://wordpress.org/latest.zip unzip latest.zip mv wordpress/* . rm latest.zip rm -rf wordpress
这不是一个完美的解决方案(我想尽可能地自动化所有事情),但它现在有效。
如有任何关于原始问题的建议,我们将不胜感激。
如果您将 WP 用作子模块,这意味着您可能需要访问该子模块内的历史记录。这意味着您需要这个包文件。
Git 将数据打包到打包文件中。这是为了提高效率和节省磁盘 space 的目的。参见 Git internal - Packfiles . If you wonder what is in the packfile, you can use the git verify-pack command。与 -v 选项一起使用,您可能会发现一个巨大的文件已放入您的存储库中。
如果出于某些原因你想 'clean' 子模块,我建议你阅读 Why is my repo so big ?
如果你不想要子模块中的完整历史,你可以尝试使用 -depth 选项克隆它(参见 git submodule command),这样它就是一个历史被截断的浅克隆。这可能会减小包文件夹的大小。
1) 在没有递归选项的情况下克隆主仓库
2) 在主仓库中,使用带有 -depth 选项的 git 子模块命令初始化子模块
自 Git 2.10+(2016 年第 3 季度)起,您将能够进行常规克隆...并且仍然受益于 子模块的浅层克隆。
您需要做的就是在 .gitmodules
:
git config -f .gitmodules submodule.<name>.shallow true
添加、提交和推送:任何克隆您的存储库(常规克隆、完整历史记录)的人都只会获得子模块的深度 1 <name>
。
参见 commit f6fb30a, commit abed000 and commit 37f52e9 (03 Aug 2016) by Stefan Beller (stefanbeller
)。
(由 Junio C Hamano -- gitster
-- in commit dc7e09a 合并,2016 年 8 月 8 日)
> submodule update
: 学习 --[no-]recommend-shallow
选项
Sometimes the history of a submodule is not considered important by the projects upstream. To make it easier for downstream users, allow a boolean field '
submodule.<name>.shallow
' in.gitmodules
, which can be used to recommend whether upstream considers the history important.This field is honored in the initial clone by default, it can be ignored by giving the
--no-recommend-shallow
option.