回购里面的Git回购

nul*_*ull 38 git git-submodules

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

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

Tro*_*ott 32

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

通过使pychargify成为django项目的子模块,django项目的特定修订版可以与pychargify项目的特定修订版关联.这真的很有用.

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


And*_*all 28

Git具有在另一个子模块中拥有存储库的功能.

git submodule add https://github.com/getyouridx/pychargify.git
Run Code Online (Sandbox Code Playgroud)

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

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

  • `git submodule add https://github.com/getyouridx/pychargify.git my-app/pychargify/` 给我“my-app/pychargify/ 已存在于索引中” (2认同)
  • @AdamGamble也许你删除了目录但没有从git中删除它?检查`git status`以查看它是否显示为已删除但未提交. (2认同)

man*_*lds 14

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

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


Wto*_*wer 8

Git子树

Git 子模块是一种常见的方法,自从引入以来就获得了很大的发展,以应对可能想要在另一个项目(仓库)内添加一个项目(仓库)的情况,正如其他答案已正确描述的那样。

然而,人们可以说,子模块的方式是不是唯一的方法和occassionaly不走正确的路,根据既定的工作流程,在几页,如提及的,我不会去分析和多种原因进行了简要这个。最重要的是:

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

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

另一个重要原因是流行的PyCharm IDE(撰写本文时;存在一个非常老的问题),并且可能还有其他人没有完全实现git子模块,并且编码器将失去显示所有内容的IDE的精妙功能。更改了子模块中的行。

因此,解决此问题的另一种方法是使用子树。请注意,子树和子树合并不是一回事,但这又是另一回事。Progit优秀的第二版书籍简要介绍了后者,但没有一本单独的参考书。

因此,在一个实际的例子中,为了处理所关注的情况,假定a 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
Run Code Online (Sandbox Code Playgroud)

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

git subtree pull —prefix=subproject subproject_remote master
Run Code Online (Sandbox Code Playgroud)

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

git subtree push —prefix=subproject subproject_remote new_branch
Run Code Online (Sandbox Code Playgroud)

链接中的分析性教程颇为分散。

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


Pat*_*yer 6

如您所料,将一个包含git项目的文件夹添加到另一个git项目中的方式可以正常工作:它们之间没有直接的交互,并且您可以通过在一个目录或另一个目录中进行工作来独立地提交更改。您可以使“父”项目完全忽略内部文件夹,也可以提交子文件夹中的选定文件,就像它们是父项目的一部分一样。

如果执行后者,则在修改文件时,两个git项目都将其视为已修改,并且您可以通过简单地在一个目录或另一个目录中进行操作来独立地管理那些更改(提交更改)。

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

我发现上面的过程比处理子模块更简单,但是其他人对如何使用它们进行了评论,因此您可能希望进行比较。