Git LFS和子模块的初始化
初始化LFS和子模块
为了在一个文件夹内初始化Git库,同时包含一个子文件夹的Git库和大文件(使用Git Large File Storage, LFS),需要初始化LFS和子模块:
-
安装Git LFS: 可以访问Git LFS官网了解如何安装。
-
初始化顶层文件夹为Git库: 打开命令行或终端,切换到顶层文件夹路径,运行以下命令来初始化一个新的Git库:
1
git init
-
添加Git LFS支持: 在同一个目录中,运行以下命令来启用Git LFS:
1
git lfs install
-
配置LFS跟踪大文件: 确定用LFS跟踪的大文件或文件类型。使用
git lfs track
命令来指定。例如,如果想跟踪所有的.zip
文件,可以运行:1
git lfs track "*.zip"
执行这个命令后,它会在
.gitattributes
文件中添加相关配置。确保将.gitattributes
文件添加到仓库中:1
git add .gitattributes
-
添加子文件夹的Git库作为子模块: 如果子文件夹已经是一个Git库,并且想保持它的独立更新和提交历史,可以将它作为一个子模块添加。使用以下命令,其中
path_to_subfolder
是子文件夹的相对路径:1
git submodule add <repository_url> path_to_subfolder
注意:需要替换
<repository_url>
为子文件夹Git库的远程仓库URL。如果子文件夹的Git库没有远程仓库,这一步就需要先为子文件夹创建一个远程仓库。 -
提交和推送: 一旦配置了LFS跟踪并添加了所有需要的文件,就可以添加这些更改到Git仓库,并进行提交了:
1 2
git add . git commit -m "Initial commit with LFS and submodule"
如果顶层仓库有对应的远程仓库,使用
git push
命令将更改推送到远程仓库。
通过遵循以上步骤,就能在一个包含其他大文件和子文件夹Git库的顶层文件夹中,成功初始化一个Git库并启用Git LFS。
LFS隔离
在使用Git和Git Large File Storage (LFS)时,通常LFS配置是针对整个仓库的,而不是针对单独的远程仓库。这意味着,当启用了LFS并且对某些文件类型进行了跟踪,那么这些LFS跟踪的文件会在向任何远程仓库推送时一同处理。
然而,如果想要避免将LFS跟踪的文件推送到某个特定的远程仓库,就需要使用两个独立的分支管理LFS对象和非LFS对象,然后只将不包含LFS对象的分支推送到不希望包含LFS对象的远程仓库。
1. 维护两个分支
- LFS分支:这个分支包含LFS跟踪的文件,可以像平常一样在这个分支上工作。
- 非LFS分支:这个分支不包含任何LFS跟踪的文件。可以通过.gitattributes过滤规则或简单地确保不将大文件提交到这个分支上来维持这一状态。
2. 分支策略
当准备将改动推送到远程仓库时,首先确定是否需要包含LFS对象。
- 如果需要包含LFS对象,则正常地将改动推送到对应的远程仓库分支。
- 如果不需要包含LFS对象,将改动(不包括LFS文件)合并到非LFS分支,然后只推送这个分支到特定的远程仓库。
3. 示例操作
假设main
是主要工作分支(LFS分支),而non-lfs-branch
是非LFS分支。当推送到不希望包含LFS文件的远程仓库时,可以这样操作:
-
确保
non-lfs-branch
是最新的,并且包含了main
分支上的所有非LFS改动。1 2
git checkout non-lfs-branch git merge main --no-commit --no-ff
在合并过程中,如果出现包含LFS文件的改动,需要手动解决这些差异,确保不将LFS文件包含进来。
-
完成合并后,将
non-lfs-branch
推送到不需要LFS文件的远程仓库。1
git push <remote-name> non-lfs-branch:<remote-branch-name>
替换
<remote-name>
和<remote-branch-name>
为目标远程仓库名称和分支名称。