git submodule commit / push / pull

我想使用git submodule。

我需要采取的步骤推动我对项目的更改

  • 从子模块目录添加/提交/推送
  • 从父目录添加/提交/推送
  • 我需要采取措施来改变我的项目。

  • 从父目录的git拉
  • git子模块从父目录更新
  • 从其原始回购更新子模块的步骤

  • git从子模块目录中拉出来
  • 我担心的是以下来自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

    上一篇: git submodule commit/push/pull

    下一篇: Recursive Git push/pull?