2017-02-04 78 views
3

我有一个名为“foo”(或者说“myusername/foo”)的github存储库。现在假设我想创建一个名为“bar”的存储库,它使用foo中的代码;我可以制作一份文件的副本,但我不想要更新 - 我只想现在只查看“foo”存储库中的所有内容;并且不提供“从foo更新”的提交。我相信我已经注意到一些存储库,其中子文件夹实际上是独立的存储库;而且我知道git支持子库或其他类似的东西。那么,我可以执行这样的“存储库装载”吗?如果是这样,怎么样?如果如何将一个github存储库“mount”为另一个存储库的子文件夹?

加分点我可以有“摩的”在某个版本,还是有一定的分支,而不是主

+1

使用子模块进行调查。他们并不完美,但他们可能会解决你的问题。 –

+0

@TimBiegeleisen:链接?而且 - 你的意思是说这是GitHub功能还是git功能? – einpoklum

+0

这是一个:http://blog.joncairns.com/2011/10/how-to-use-git-submodules/ –

回答

3

你要管理的git子项目2的主要选择。
Git不会有任何依赖性经理和最常用的选项如下:

  • 子模块

Submodules
允许将外部存储库嵌入源树的专用子目录中,始终指向特定的提交。


git submodule

为了使用子模块的每个文件夹将是一个独立的存储库,并进行管理,并存储在不同的位置。 Git将签出特定的提交(提交,版本,标签等)并将其用作子模块的HEAD。大多数情况下子模块将处于分离的HEAD中。

# once you have a repo simply add it to git 
git submodule add <url> 

一旦投影被添加到你的回购,你必须初始化和更新它。

git submodule init 
git submodule update 

作为GIT中的1.8.2新选项--remote加入

git submodule update --remote --merge 

fetch从上游每个子模块中的最新变化,merge them in,和check out子模块的最新版本。

由于the docs形容它:

--remote

此选项仅适用于update命令。使用子模块的远程跟踪分支的状态,而不是使用超级项目的已记录的SHA-1来更新子模块。

这相当于在每个子模块中运行git pull。


如何解决或子模块内部的变化代码?

使用子模块将会把你的主要项目中的代码作为其内容[新文件夹]的一部分。

将它置于文件夹内部或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库,如上所述。


这是一个子模块 - 项目在另一个项目中,其中每个项目是一个独立的项目的说明。

enter image description here


git subtree

的Git树允许你插入任何存储库中的另一个

一个子目录非常相似,submodule,但主要区别在于代码的管理位置。在子模块中,内容被放置在单独的回购站中,并在那里进行管理,以便您将其克隆到其他许多回购站。

subtree被管理内容作为根项目的一部分,而不是在一个单独的项目。

而不是写下如何设置和理解如何使用它,你可以简单地阅读这个优秀的文章,这将解释这一切。

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

+0

关于git子模块:我不明白...(1)什么时候是“一旦你有回购“?什么时候和什么时候我发出子模块add命令? (2)在列出的命令中,我应该指定将子模块检入哪个子文件夹中(3)HEAD如何成为除分支上最新提交之外的任何内容?你说如果我选择corelib repo的某个提交,它将成为我的HEAD;这似乎与您所链接的定义相矛盾。 – einpoklum

+1

(1):一旦你有一个回购 - 为你想要的代码创建一个新的回购,而不是原始回购的一部分。 (2)子模块的名称将是该文件夹,或者您可以传递其他参数来指定名称。 (3)git可以指向任何不仅是最新的提交者。试试这个:'git checkout HEAD〜10' – CodeWizard

2

旁边的子模块和子树,根据您的具体需求,您可能还需要只是有没有任何逻辑和管理的另一个仓库。

在这种情况下,您可以将另一个存储库放在子目录中,并将该子目录添加到.gitignore文件中。

E.g.

RepositoryA/ 
    - .gitignore (first option) 
    - SomeDir/ 
    - .gitignore (second option) 
    - RepositoryB/ 

的.gitignore(第一个选项)

添加这些中的一个:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

的.gitignore(第二选项)

补充一点:

  • RepositoryB/

这样一来,正如我所说的,不添加任何逻辑/管理。它只是让你可以使用任何版本库中的任何版本而不会发生任何冲突。

相关问题