我想与您分享我的经验,与您一起尝试解决类似问题的Visual Studio解决方案中的外部项目。我对git比较陌生,所以如果任何人有任何建设性的批评,我会很感激。
如果您使用的是Visual Studio,Git源代码管理提供程序扩展是免费的(http://visualstudiogallery.msdn.microsoft.com/63a7e40d-4d71-4fbb-a23b-d262124b8f4c),并且在我测试它时似乎递归提交子模块。但是我不想依赖扩展(我也认为很好地了解引擎盖下发生了什么),但是我在开发中使用VS Web Developer Express。因此我不得不弄清这些命令,并在下面添加了一些注释。
注意
如果您还没有这样做,有一个彻底读通过http://git-scm.com/book/en/Git-Tools-Submodules。有几个警告,我会回到这个页面。如果您尝试在不阅读本文的情况下使用子模块进行操作,您将很快就会头痛。
我的做法是遵循本教程中,有一些额外设施:http://blog.endpoint.com/2010/04/git-submodule-workflow.html
一旦你有你上层项目初始化(如git init
& & git remote add origin ...
),开始添加你的子模块,像这样:
git submodule add git://github.com/you/extension1.git extension
git submodule init
git submodule update
检查你的.gitmodules文件反映了这一点,例如
[submodule "extension1"]
path = extension
url = git://github.com/you/extension1.git
切换到您的子模块目录(即cd extension
)。兼营:
git fetch #I use fetch here - maybe you can use pull?
git checkout -b somebranchname #See the Git-Tools-Submodules link above for an explanation of why you need to branch
我在这里做了更改的README.txt,所以我可以提交它(也因此我有什么,我在此承诺做一个记录),然后COMMITED模块应用分支(仍然在子模块目录):
git add .
git commit -a -m "Branching for extension submodule"
现在进入上层项目(即cd ..
)。您还需要在这里提交(如果你看看我所提到的git的子模块页面也解释了为什么这是必要的):
git status #will show you that your submodule has been modified
git commit -a -m "Commiting submodule changes from superproject"
现在我们可以recusively推动我们的项目,像这样如果需要的话:
git push --recurse-submodules=on-demand
您需要对所有子模块执行一次上述步骤。
一旦你完成了这对所有子模块,并开始制作要提交和推送更改,您可以使用:
git submodule foreach 'git add .' #recursively add files in submodules
Unfortunaly我还没有找到一种方法,而无需使用类似递归提交git-slave
(任何人?),因此您需要进入每个子模块目录并对刚刚添加的文件运行常规提交。在上层项目:
git status #tells you that `extension` submodule has been modified
cd extension
git commit -a -m "Commiting extension changes in superproject edit session"
一旦子模块commiting,您还需要提交上层项目(再次),所以:
cd ..
git add .
git commit -a -m "Altered extension submodule"
git status #should now show 'working directory clean', otherwise commit other submodules in the same manner
这可以让有点恼人的(因为你最终提交两次),但一旦你意识到它实际上并不坏(因为它迫使你检查你在每个项目中提交的内容)。只是我的看法 - 如果你已经将一些超级项目的功能分离到了子模块中,它应该与你的其他项目分开工作(所以在不同时间提交它们,而烦人不是世界的尽头)。
现在我们可以把一次...
git push --recurse-submodules=on-demand
如果你再进入到您的子模块并再次尝试推,你会发现它不会做任何事情的最新提交已是推。
为超级项目克隆(或使用远程原点)也可能相当混乱 - 例如需要在git submodule init
后两次运行git submodule update
。阅读http://git-scm.com/book/en/Git-Tools-Submodules中的“用子模块克隆项目”部分。
克隆我的超级项目时引起我注意的事情是获取子模块的最新更改。见Easy way pull latest of all submodules
我的这个变体是使用签出的子模块一个“发展”分支(但你可以调用它任何你想要的),然后在上层项目使用:
git submodule foreach git pull origin development
当我设置这件事我也交换到我想我的变化推动对检查出的子模块,像这样的分支:
cd extension
git checkout -b development #This will tell you this is a new branch, but I believe this means a new branch of the local git repository - this will get pushed to the 'development' branch
#Make your changes, commit etc.
我可以确认的是,当我按照上面的步骤,在克隆/远程更改子模块原始项目(推动时)出现在其他克隆中es /远程同一项目的起源(不要忘记最后一个子模块拉命令)。
我希望这对你有一些用处。
是的,当然如果你修改子模块时没有提交/推送,当你进行子模块更新时,它会检出原子模块头,所以你会留下你的修改,为了不用这种情况,你应该创建一个分支,修改子模块和提交,如果您进行子模块更新,您将离开您的分支到原始子模块头,不用担心,您现在可以合并您的子模块分支或者只需签出即可。 –
你能更具体吗?假设两个程序员正在修改团队项目的子模块。他们需要做什么?它们中的每一个都在子模块文件夹中创建一个具有相同名称/修改/提交/推送的分支。和子模块更新,然后呢? – eugene
我正在尝试为您准备更深入的答案,因为我正在处理类似的问题。与此同时,您是否阅读过http://blog.endpoint.com/2010/04/git-submodule-workflow.html和http://stackoverflow.com/questions/5814319/git-submodule-push?第一个链接还包括用子模块创建分支(如果您想了解为什么阅读'Submodules问题',请点击http://git-scm.com/book/en/Git-Tools-Submodules)。 –