Git 和子模块使用
Git and submodule usage
所以,我有以下文件夹结构:
.
└── testSubModules
├── README.md
└── controllers
├── controller-1
│ └── test.c
├── controller-10
├── controller-2
├── controller-3
├── controller-4
├── controller-5
├── controller-6
├── controller-7
├── controller-8
└── controller-9
testSubMoudles
是我的 git 目录的根目录。 controllers
目录下的每个文件夹代表 eclipse
中的一个项目
我希望能够在根 (testSubModules
) 以及项目下的每个单独项目中管理项目。
我认为 submodules 是我要找的。
Requirements/Goals/Desired 工作流程
- 新开发者应该能够通过 root 获取项目
git clone url/subModules
或按个别项目
git clone url/subModules/controller-1
阅读该教程后,我认为这是不可能的。
- 开发人员如何才能仅在子模块上进行提交和推送更改?
假设我在 controller-1 下做了一些工作。将我的更改添加到该子模块的工作流程是什么
假设,Eric,另一个开发人员现在想要我对子模块的更改,他如何更新他的工作区?
比方说,James,另一个开发人员想要一切,那么他可以在项目的根目录上做一个 git pull
。
也许我所说的一切都不是子模块的预期用途。那我该怎么办呢?
这正是子模块的用途。
问题是,克隆并不像您在问题中建议的那样工作,除非您将各个存储库托管在与项目结构匹配的 url 结构中,在这种情况下您实际上可以克隆url/ParentRepo/SubModule。这方面的一个例子是 https://gerrit.wikimedia.org/r/mediawiki and https://gerrit.wikimedia.org/r/mediawiki/extensions/* - 每个扩展都在一个 url 路径中,该路径匹配它作为 mediawiki 目录中的子模块的相对位置。
不幸的是,git 存储库通常不会以这种方式托管,例如,在 github 上,您的命名空间是扁平的,因此您不能在 url 另一个。单独克隆子模块时,您需要知道子模块 git 存储库的绝对 url,这不一定与父存储库的 url 相关。
子模块仅在概念上存在于您的存储库中 - 当您对父存储库进行基本克隆时,它根本不会获取子模块。要使用父存储库获取子模块,您必须使用 git clone recursive
进行初始克隆,或者,如果您已经有一个没有子模块的克隆,则 运行 git submodule update --init --recursive
来获取它们。
子模块的另一个问题是直接在子模块存储库上完成的开发不会自动显示在父存储库中。在将新提交推送到子模块存储库后,您必须显式添加更改并将它们提交到父存储库。这个额外的步骤容易出错且烦人,但它是子模块工作方式的基础。
使用 Rakefile 概念:在项目中您可以组合多个项目:
desc 'submodule'
task :submodule do
sh 'git submodule init'
sh 'git submodule update'
sh 'git submodule add <origen>'..
..
end
desc 'submodulePull'
task :submodulePull do
sh 'git submodule update'
sh 'git submodule foreach git pull'
end
航站楼:
rake submodule
to add other project in your project .
cd project
to use project independently. can run git etc..
rake submodulePull
to pull all project change .
所以,我有以下文件夹结构:
.
└── testSubModules
├── README.md
└── controllers
├── controller-1
│ └── test.c
├── controller-10
├── controller-2
├── controller-3
├── controller-4
├── controller-5
├── controller-6
├── controller-7
├── controller-8
└── controller-9
testSubMoudles
是我的 git 目录的根目录。 controllers
目录下的每个文件夹代表 eclipse
我希望能够在根 (testSubModules
) 以及项目下的每个单独项目中管理项目。
我认为 submodules 是我要找的。
Requirements/Goals/Desired 工作流程
- 新开发者应该能够通过 root 获取项目
git clone url/subModules
或按个别项目
git clone url/subModules/controller-1
阅读该教程后,我认为这是不可能的。
- 开发人员如何才能仅在子模块上进行提交和推送更改?
假设我在 controller-1 下做了一些工作。将我的更改添加到该子模块的工作流程是什么
假设,Eric,另一个开发人员现在想要我对子模块的更改,他如何更新他的工作区?
比方说,James,另一个开发人员想要一切,那么他可以在项目的根目录上做一个
git pull
。
也许我所说的一切都不是子模块的预期用途。那我该怎么办呢?
这正是子模块的用途。
问题是,克隆并不像您在问题中建议的那样工作,除非您将各个存储库托管在与项目结构匹配的 url 结构中,在这种情况下您实际上可以克隆url/ParentRepo/SubModule。这方面的一个例子是 https://gerrit.wikimedia.org/r/mediawiki and https://gerrit.wikimedia.org/r/mediawiki/extensions/* - 每个扩展都在一个 url 路径中,该路径匹配它作为 mediawiki 目录中的子模块的相对位置。
不幸的是,git 存储库通常不会以这种方式托管,例如,在 github 上,您的命名空间是扁平的,因此您不能在 url 另一个。单独克隆子模块时,您需要知道子模块 git 存储库的绝对 url,这不一定与父存储库的 url 相关。
子模块仅在概念上存在于您的存储库中 - 当您对父存储库进行基本克隆时,它根本不会获取子模块。要使用父存储库获取子模块,您必须使用 git clone recursive
进行初始克隆,或者,如果您已经有一个没有子模块的克隆,则 运行 git submodule update --init --recursive
来获取它们。
子模块的另一个问题是直接在子模块存储库上完成的开发不会自动显示在父存储库中。在将新提交推送到子模块存储库后,您必须显式添加更改并将它们提交到父存储库。这个额外的步骤容易出错且烦人,但它是子模块工作方式的基础。
使用 Rakefile 概念:在项目中您可以组合多个项目:
desc 'submodule'
task :submodule do
sh 'git submodule init'
sh 'git submodule update'
sh 'git submodule add <origen>'..
..
end
desc 'submodulePull'
task :submodulePull do
sh 'git submodule update'
sh 'git submodule foreach git pull'
end
航站楼:
rake submodule
to add other project in your project .cd
project
to use project independently. can run git etc..
rake submodulePull
to pull all project change .