2013-01-09 54 views
9

我想使用git submodule。git submodule commit/push/pull

我需要把我的变化推到我的项目的步骤是从子模块目录

  1. 添加/提交/推
  2. 添加/提交从父目录/推

我需要采取措施来拉动我的项目变化。从父目录 从父目录

  • 混帐子模块更新
  • 步骤

    1. 混帐拉从原来的回购从

      1. 混帐拉更新子模块子模块目录

      我担心的是http://git-scm.com/book/en/Git-Tools-Submodules

      以下exerpt的问题是,你通常并不想在一个分离的头 的环境中工作,因为它很容易失去的变化。如果您执行初始的 子模块更新,请在该子模块目录中提交而不创建 分支,然后再次从 超级项目中运行git子模块更新,但不提交(更新/提交/更新将会失去改变?)Git会在没有告诉您的情况下覆盖您的更改 。从技术上讲,你不会失去工作, 但你不会有一个分支指向它,所以它会有点难以检索 。

      要避免此问题,请在使用git checkout -b工作或类似工具在子模块 目录中工作时创建分支。当你 做子模块第二次更新时,它仍然会恢复你的工作,但至少你有一个返回的指针。

      我打算修改子模块,不想搞乱,上面的文档简单地提到了丢失改变的可能性,我不明白什么可能会导致损失。

      我不知道什么额外的步骤超过我上面列出我需要采取以防止 损失。 特别是几个团队成员修改子模块,他们需要什么不要搞乱?

    +0

    是的,当然如果你修改子模块时没有提交/推送,当你进行子模块更新时,它会检出原子模块头,所以你会留下你的修改,为了不用这种情况,你应该创建一个分支,修改子模块和提交,如果您进行子模块更新,您将离开您的分支到原始子模块头,不用担心,您现在可以合并您的子模块分支或者只需签出即可。 –

    +0

    你能更具体吗?假设两个程序员正在修改团队项目的子模块。他们需要做什么?它们中的每一个都在子模块文件夹中创建一个具有相同名称/修改/提交/推送的分支。和子模块更新,然后呢? – eugene

    +0

    我正在尝试为您准备更深入的答案,因为我正在处理类似的问题。与此同时,您是否阅读过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)。 –

    回答

    19

    我想与您分享我的经验,与您一起尝试解决类似问题的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 /远程同一项目的起源(不要忘记最后一个子模块拉命令)。

    我希望这对你有一些用处。

    +0

    感谢您的详细解答,我决定我应该推迟这个子模块的东西一会儿.. – eugene

    +0

    我明白了。我是一个Ubuntu迷,所以我觉得在Git的Windows安装程序附带的开箱即用BASH外壳并且一直在使用它。如果您打算在某种IDE项目设置中使用它(例如我为Visual Studio描述的那样),则可能需要为您的IDE选择一个合适的插件。 –

    +1

    [要一次提交每个子模块](http://stackoverflow.com/questions/19728933/continue-looping-over-submodules-with-the-git-submodule-foreach-command-after),您可以使用: 'git submodule foreach'git commit -a -m“修改后的子模块”|| :'' – Cel