Git:从现有存储库中创建Git子模块,并反映对子存储库的父更改

时间:2013-05-06 20:29:32

标签: git github repository git-submodules

请注意我是Git的新手。

我有两个回购:

  1. Libgdx REPO
  2. gdx-sqlite REPO
  3. 主存储库是Libgdx REPO,我的所有工作都进入了这个存储库,主要是在gdx-sqlite project。由于我希望gdx-sqlite项目作为单独的存储库出现,我所做的是:

    1. 在GitHub上创建了一个新的repo(gdx-sqlite REPO)
    2. 在我的机器上创建了一个本地仓库(嵌套在本地libgdx仓库内)
    3. 将本地嵌套repo的所有代码推送到远程gdx-sqlite REPO
    4. 这导致一切都出错了,我认为嵌套存储库是罪魁祸首。后来我删除了本地嵌套存储库并恢复到之前的提交。我发现这种问题的解决方案是Git Submodules但是我完全迷失了我想要达到的目标,如下所示。

      现在我应该如何根据以下内容实现这一目标:

      1. 我想在“gdx-sqlite REPO”创建一个新的仓库,它应该始终反映我对位于https://github.com/mrafayaleem/libgdx/tree/master/extensions/gdx-sqlite”的项目所做的更改
      2. 任何向“gdx-sqlite REPO”发送Pull请求的人都应该能够获取所有依赖项(即完整的libgdx REPO),以便他可以立即处理该扩展。
      3. 如何才能做到这一点?

3 个答案:

答案 0 :(得分:6)

你是对的。这种情况的好方法是使用Git submodules。这是处理Git中依赖项的最佳方法。

由于gdx-sqlite是主项目Libgdx的扩展,您可以通过这种方式将其添加为子模块:

git clone git@github.com:mrafayaleem/libgdx.git libgdx
cd libgdx
# remove the old directory
rm -rf extensions/gdx-sqlite
git add extensions/gdx-sqlite
# add the submodule (note the read-only URL)
git submodule add git://github.com:mrafayaleem/gdx-sqlite.git extensions/gdx-sqlite
# commit the changes
git commit -m 'Add submodule for the gdx-sqlite extension'

然后克隆您的项目(及其所有子模块):

git clone --recursive git://github.com/mrafayaleem/libgdx.git

或者你(具有写访问权限):

git clone --recursive git@github.com:mrafayaleem/libgdx.git

答案 1 :(得分:2)

你应该看看git subtree。 这允许您将一个或多个git存储库添加为子树。

其中一个缺点是,你需要谨慎对待你的提交。如果对不同子树中的文件进行多次更改,则所有存储库将在其历史记录中进行此提交。如果您尝试确定一个仓库中的更改并且无法找到日志中提到的文件,这可能会非常讨厌,因为该文件从不属于此仓库。解决方案是将提交拆分到不同的存储库。

答案 2 :(得分:0)

这对我有用:

git ls-files --stage | grep $160000

基于这篇伟大的文章:http://www.speirs.org/blog/2009/5/11/understanding-git-submodules.html