eug*_*ene 11 git git-submodules
我想使用git子模块.
我需要采取的步骤将我的更改推送到我的项目中
- 从子模块目录添加/ commit/push
- 从父目录添加/提交/推送
我需要采取措施来拉动项目的变化.
- 来自父目录的git pull
- 从父目录更新git子模块
从原始仓库更新子模块的步骤
- 来自子模块目录的git pull
令我担心的是http://git-scm.com/book/en/Git-Tools-Submodules的以下内容
问题是您通常不希望在分离的HEAD环境中工作,因为它很容易丢失更改.如果你做了一个初始子模块更新,在该子模块目录中提交而不创建一个分支工作,然后再从超级项目运行git子模块更新而不同时提交,(?? update/commit/update将失去更改?) Git会在不告诉您的情况下覆盖您的更改.从技术上讲,你不会失去工作,但你不会有一个分支指向它,所以它将有点难以检索.
要避免此问题,请在使用git checkout -b work或等效工作的子模块目录中创建分支.当您第二次执行子模块更新时,它仍将恢复您的工作,但至少您有一个指针可以返回.
我要修改子模块并且不想搞砸,上面的文档简要提到了失去变化的可能性,我不明白可能导致丢失的原因.
我想知道除了上面列出的更多的其他步骤,我需要采取什么来防止损失.特别是几个团队成员修改子模块,他们需要做些什么不搞乱?
Aar*_*ton 20
我想与您分享我在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
Run Code Online (Sandbox Code Playgroud)
检查您的.gitmodules文件是否反映了此添加内容,例如
[submodule "extension1"]
path = extension
url = git://github.com/you/extension1.git
Run Code Online (Sandbox Code Playgroud)
切换到子模块目录(即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
Run Code Online (Sandbox Code Playgroud)
我在这里对README.txt进行了更改,因此我可以提交它(同样我也会记录我在此提交中所做的事情),然后提交模块以应用分支(仍在子模块目录中):
git add .
git commit -a -m "Branching for extension submodule"
Run Code Online (Sandbox Code Playgroud)
现在进入超级项目(即cd ..
).你还需要在这里提交(如果你看一下我提到的git子模块页面,它解释了为什么这是必要的):
git status #will show you that your submodule has been modified
git commit -a -m "Commiting submodule changes from superproject"
Run Code Online (Sandbox Code Playgroud)
现在我们可以根据需要反复推动我们的项目:
git push --recurse-submodules=on-demand
Run Code Online (Sandbox Code Playgroud)
您需要为所有子模块执行一次上述步骤.
为所有子模块完成此操作并开始进行要提交和推送的更改后,您可以使用:
git submodule foreach 'git add .' #recursively add files in submodules
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有找到一种方法来递归提交而不使用像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"
Run Code Online (Sandbox Code Playgroud)
子模块提交后,您还需要再次提交超级项目,因此:
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
Run Code Online (Sandbox Code Playgroud)
这可能会有点烦人(因为你最终会提交两次),但是一旦你意识到这一点,它实际上并没有那么糟糕(因为它迫使你检查你在每个项目中提交的内容).只是我的意见 - 如果你已经将一些超级项目的功能分离到子模块中,它应该与你的其他项目隔离开来(所以在不同时间提交它们而烦人不是世界末日).
现在我们可以再推一次......
git push --recurse-submodules=on-demand
Run Code Online (Sandbox Code Playgroud)
如果你然后进入你的子模块并尝试再次推送,你会发现它不会做任何事情,因为已经推送了最新的提交.
对超级项目进行克隆(或使用远程源)也可能非常混乱 - 例如需要在之后运行git submodule update
两次git submodule init
.阅读http://git-scm.com/book/en/Git-Tools-Submodules的 "使用子模块克隆项目"部分.
克隆我的超级项目时抓住了我的东西是获取子模块的最新更改.请参阅Easy way pull最新的所有子模块
我的变体是使用'开发'分支检出子模块(但你可以随意调用它),然后在超级项目中使用它:
git submodule foreach git pull origin development
Run Code Online (Sandbox Code Playgroud)
当我设置它时,我也交换到我希望将更改推送到已检出的子模块的分支,如下所示:
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.
Run Code Online (Sandbox Code Playgroud)
我可以确认,当我按照上述步骤操作时,对克隆/远程源项目中子模块的更改(推送时)会显示在同一项目的其他克隆/远程源中(不要忘记最后一个子模块拉取命令).
我希望这对你有用.
归档时间: |
|
查看次数: |
22215 次 |
最近记录: |