2011-12-01 263 views

回答

22

为了有一个混帐回购协议“内部”另一个,看git的子模块:http://git-scm.com/book/en/Git-Tools-Submodules

通过使pychargify Django项目的一个子模块,Django项目的具体版本可以与您pychargify项目的特定修订相关。这可能非常有用。

我不确定您所描述的方法具体是什么危险,但它不会通过我的气味测试。我建议使用专门为这种类型设计的Git功能(子模块)。

18

Git有一个在另一个仓库中的功能:submodules

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

请务必阅读子模块的完整文档,因为所涉及用他们一些怪癖,而需要采取的做自己的存储库的全新副本时初始化子模块的额外步骤。

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

+0

伟大的答案谢谢!不要以为你知道把它安装在子目录中的技巧。需要在django应用程序,这不是根目录... – null

+0

'git submodule添加https://github.com/getyouridx/pychargify.git我的应用程序/ pychargify /'给我“我的应用程序/ pychargify /已存在于索引“ – null

+0

@AdamGamble中,您可能已在存储库中有一个”my-app/pychargify“文件夹,您需要删除它以添加子模块。 –

10

Git自动忽略,甚至不允许你添加任何名为.git的文件/文件夹。所以你可以在你的仓库里添加一个仓库并且在仓库里工作。但是,您可能必须忽略内部回购文件夹pychargify

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

+1

即使我需要与其他人分享内部回购,只是进入该回购并提交,推或拉是不行的? – qed

4

Git的子树

的Git submodules是一种常见的方式,获得多地自介绍,为了应对其中一个可能要到另一个项目(回购)中添加一个项目(回购)的情况下,正如其他答案已经正确描述。

尽管如此,有人可能会争辩说,子模块的方式不是唯一的方式,偶尔也不是正确的方式,这取决于已建立的工作流程,有几个原因,我不打算分析,并在几页中简要提及如thisthis。最重要的无疑是这样的:

当混帐落入冲突解决模式,它仍然没有更新的子模块的指针 - 这意味着,当你解决冲突后提交的合并,你遇到了同样的问题。 ..:如果你忘了运行git子模块更新,你刚刚还原了任何子模块提交你合并的分支。

当然,在一个完美的工作流程中,这绝不会发生。

另一个重要的原因是流行的PyCharm IDE(当写这篇文章时,有一个非常有用的old issue),也有可能是其他人不能完全实现git子模块,编码器将失去其中的漂亮功能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的分析,而是唠唠教程。

此功能已得到了一些缺点,以及,例如很多人觉得麻烦,更复杂的工作流程,但这又取决于特定的既定工作流程。

1

添加包含Git项目中的另一个Git项目工作,你可能期望一个文件夹:它们之间没有直接的互动,你可以在一个目录或其他工作独立提交更改。您可以让“父项目”项目完全忽略内部文件夹,也可以从子项目文件夹中提交选定的文件,就好像它们是父项目的一部分一样。

如果您通过简单地在一个目录或其他工作做后者,然后在修改双方的Git项目,修改后,可以看到一个文件,你可以独立管理这些变化(提交更改)。

我假设您在这里使用命令行工具,但我相信XCode 7可能会理解这种情况并在文件上显示更改注释,只要这些文件被修改为一个或两个git存储库。

我发现上面的程序比处理子模块简单,但其他人都谈到了如何使用这些,所以你可能需要比较。