git submodule commit / push / pull
我想使用git submodule。
我需要采取的步骤推动我对项目的更改
我需要采取措施来改变我的项目。
从其原始回购更新子模块的步骤
我担心的是以下来自http://git-scm.com/book/en/Git-Tools-Submodules
问题在于,您通常不希望在分离的HEAD环境中工作,因为很容易失去更改。 如果您执行初始子模块更新,则在该子模块目录中提交而不创建要工作的分支,然后在超级项目中再次运行git子模块更新而不提交,( 更新/提交/更新将失去更改? ) Git会在不告诉您的情况下覆盖您的更改。 从技术上讲,你不会失去工作,但你不会有分支指向它,所以检索起来会有些困难。
为了避免这个问题,在你使用git checkout -b工作或类似的东西工作在子模块目录下时创建一个分支。 当您再次执行子模块更新时,它仍会恢复您的工作,但至少您有一个返回的指针。
我要修改子模块,不想搞乱,上面的文档简单地提到了丢失改变的可能性,我不明白什么可能会导致损失。
我想知道还有哪些额外步骤比我上面列出的更多,我需要采取措施来防止这种损失。 特别是几个团队成员修改子模块,他们需要什么不要搞乱?
我想与您分享我的经验,作为与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文件,这样我就可以提交它(也就是说我会记录下我在这个提交中做了什么),然后提交模块应用分支(仍在子模块目录中):
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"
现在,如果需要,我们可以按照原样推送我们的项目:
git push --recurse-submodules=on-demand
您需要为所有子模块执行一次上述步骤。
一旦你完成了所有你的子模块,并开始进行你想要提交和推送的更改,可以使用:
git submodule foreach 'git add .' #recursively add files in submodules
不幸的是,我还没有找到一种递归提交的方式,而不使用像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"
一旦子模块提交,您还需要提交超级项目(再次),所以:
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中的“用子模块克隆项目”一节。
在克隆我的超级项目时遇到的问题是获取子模块的最新更改。 请参阅轻松拉动所有子模块的最新版本
我的这种变体是为检出的子模块使用“开发”分支(但可以随意调用它),然后在超级项目中使用它:
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.
我可以证实,当我遵循上述步骤时,在同一项目的其他克隆/远程源中(不会忘记最后一个子模块拉取命令),克隆/远程源项目中的子模块更改(推送时)。
我希望这对你有一些用处。
链接地址: http://www.djcxy.com/p/92379.html