回购里面的Git回购

时间:2011-12-01 00:16:29

标签: git git-submodules

我想将https://github.com/getyouridx/pychargify克隆到我的django项目中,并且需要不时地提取更新。

为了澄清,我可以简单地从django项目的根目录中编写一个gitignore,例如.gitignore: pychargify/.git或者我还应该注意其他陷阱吗?

5 个答案:

答案 0 :(得分:26)

要在另一个内部有一个git repo,请查看git子模块:http://git-scm.com/book/en/Git-Tools-Submodules

通过使pychargify成为django项目的子模块,django项目的特定修订可以与pychargify项目的特定修订相关联。这可能非常有用。

我不确定你描述的方法究竟有什么危险,但它并没有通过我的气味测试。我建议使用专门为此类事物设计的Git功能(子模块)。

答案 1 :(得分:25)

Git有一个功能,可以将存储库放在另一个存储库中:submodules

git submodule add https://github.com/getyouridx/pychargify.git

请务必阅读有关子模块的完整文档,因为使用它们时会遇到一些问题,以及在对您自己的存储库进行全新克隆以初始化子模块时需要采取的其他步骤。

另请注意,所有子模块命令都必须在存储库的根目录中完成。

答案 2 :(得分:13)

Git会自动忽略,甚至不允许您添加任何名为.git的文件/文件夹。所以你可以在你的仓库中添加一个仓库并进行处理。但是,您可能必须忽略内部仓库文件夹pychargify

如果您想要与将要克隆它的其他人共享回购,则需要子模块。如果您只是想克隆内部回购并且在没有其他人参与的情况下处理您的本地回购,或者您不希望在其他地方也有回购,你真的不需要子模块。

答案 3 :(得分:5)

Git子树

Git submodules是一种常见的方式,自引入以来获得了很多好处,以便处理人们可能想要在另一个项目(repo)中添加项目(repo)的情况,因为其他答案有正确描述。

尽管如此,有人可能认为子模块的方式不是唯一的方法,而且根本不是正确的方法,取决于已建立的工作流程,出于几个原因我不打算分析,并在几页中简要提及作为thisthis。最重要的可以说是:

  

当Git进入冲突解决模式时,它仍然不会更新子模块指针 - 这意味着当您在解决冲突后提交合并时,会遇到同样的问题......:如果您忘记运行git子模块更新,你刚刚恢复任何子模块提交你合并的分支可能已经提交。

当然,在完美的工作流程中,这种情况永远不会发生。

另一个重要的原因是流行的PyCharm IDE(当这是写的;有一个非常old issue),可能还有其他人没有完全实现git子模块,编码器会失去其他的nifty IDE的功能显示子模块中所有已更改的行。

因此,处理此问题的另一种方法是使用子树。请注意,子树和subtree merging并不完全相同,但这又是另一回事。第2版​​中的优秀Progit book简要介绍了后者,但不是前者的单一参考。

因此,在一个实际示例中,为了处理所关注的情况,我们假设subproject中要使用project

$ git remote add subproject_remote (url)
# subproject_remote is the new branch name and (url) where to get it from, it could be a path to a local git repo

$ git subtree add —-prefix=subproject/ subproject_remote master
# the prefix is the name of the directory to place the subproject

$ git commit -am "Added subproject"
# possibly commit this along with any changes

如果子项目发生变化,请将其拉​​入project

git subtree pull —prefix=subproject subproject_remote master

...或相反(如果在subproject内的project内进行了更改):

git subtree push —prefix=subproject subproject_remote new_branch

这篇link中的分析但相当吵闹的教程。

此功能也有一些缺点,例如很多人发现工作流程繁琐且复杂,但这又取决于特定的工作流程。

答案 4 :(得分:5)

在另一个git项目中添加包含git项目的文件夹可以正常工作:它们之间没有直接交互,您可以通过在一个目录或另一个目录中独立地提交更改。你可以拥有"父母" project完全忽略内部文件夹,或者您可以从子文件夹提交所选文件,就像它们是父项目的一部分一样。

如果您执行后者,那么当您修改文件时,它将被两个git项目视为已修改,您可以通过简单地在一个目录或另一个目录中独立地管理这些更改(提交更改)。

我假设你在这里使用命令行工具,虽然我相信XCode 7可以理解这种情况并显示文件的更改注释,只要这些文件被一个或两个git看作是修改过的库。

我发现上面的过程比处理子模块更简单,但是其他人已经评论了如何使用这些过程以便你进行比较。

相关问题