在另一个 git 存储库中维护一个 Git 存储库

Posted

技术标签:

【中文标题】在另一个 git 存储库中维护一个 Git 存储库【英文标题】:Maintaining a Git repo inside another git repo 【发布时间】:2016-07-14 04:27:56 【问题描述】:

我有一个 git repo,其中包含一个 AngularJS 网络应用程序。

它有一个名为 build 的子文件夹,它由 gulp 任务创建。我正在部署到 Azure,因此它直接连接到我的 bitbucket 目录。

我想将构建文件夹作为一个单独的 git 存储库,从中部署 Azure 应用程序。我如何在 git 中实现这一点??

【问题讨论】:

我偷偷怀疑这里有一些过度工程,但你应该看看 git submodules Maintain git repo inside another git repo的可能重复 【参考方案1】:

虽然这方面的文档很广泛 [https://git-scm.com/book/en/v2/Git-Tools-Submodules],但我发现解决方案是了解子模块的工作原理。这是一个简化的纯英文版本。

    如果您有主存储库,并且已经使用 git ($ git innit) 对其进行了初始化,如果您将另一个已初始化的存储库添加为子模块,则可能会出现错误 如果您添加一个已经具有初始化 git 存储库的子模块,您可能希望删除 git 跟踪($ cd 进入子模块,然后 $rm -rf git)此强制删除 git 跟踪的文件 - 或在您将其添加到repo 删除初始化 检查 $ git diff / $ git diff --cached / $ git diff - - submodule 到底发生了什么,如果您有缓存文件,文档会指导您完成操作 如果您有一个未被跟踪的子模块(这是我的挑战),文档建议创建一个单独的分支并将此分支合并到 master - 这就是我所做的一些步骤,这些步骤不在文档中因为文档假设您对 git 有一定的了解,所以我花了一段时间才弄清楚我开始学习 git 时遗漏的所有步骤。
    $ git checkout -b stable (create a new branch called stable)
    $ git checkout stable (check into the new branch)
    $ cd .. (into your branch with the submodules)
    $ git submodule update --remote --merge (update and merge the submodule to the remote branch)
    $ git add . (add all files and directories  to the branch)
    $ git commit -m”adds submodule to new branch” (commit changes in the branch)
    $ git push (push changes in the branch) - this will remind you make the stable branch your upstream 
    $ git push --set-upstream origin stable (set upstream to your new branch)
    $ git checkout master (checkout into the master branch)
    $ git merge stable (merge pushed changes from branch to master)
    $ git add . 
    $ git commit -m”adds submodules from merged stable branch”
    $ git push origin master
进入您的在线存储库并检查您是否拥有这些文件。 如果这不是您面临的挑战(将已初始化的 git 模块添加到存储库),阅读文档会有点困难,但如果您解决了挑战,则值得。希望这可以帮助任何将已经初始化的 git 子模块添加到主 git 存储库的人。

【讨论】:

【参考方案2】:

您有多种选择,例如:

子模块 子树

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


git submodule

像您目前所做的那样,将您的大项目分解为子项目。 现在将每个子项目添加到您的主项目中:

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

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

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


但是,在 C 中的 bug 修复会影响与父层共享的代码的情况下,我将如何推送提交?

再次重申:使用子模块会将您的代码作为其内容的一部分放在主项目中。将其本地放在文件夹中或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库。


这是子模块的图示 - 另一个项目中的项目,其中每个项目都是一个独立的项目。


git subtree

Git 子树允许您插入任何存储库作为另一个存储库的子目录

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

subtree 将内容作为根项目的一部分进行管理,而不是在单独的项目中。

您无需写下如何设置它以及了解如何使用它,您只需阅读这篇将解释一切的优秀文章。

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

【讨论】:

如***.com/questions/47008290/… 中所述,是否还有其他没有子模块和子树的解决方案? 子树 in this question 的良好附加上下文。【参考方案3】:

你可以用 git submodule 或 subtree 来做这个,我使用 submodule 就是出于这种原因。

https://git-scm.com/docs/git-submodule

示例:

/mainrepository
/mainrepository/subrepository

cd /mainrepository/subrepository;
git init .
cd ../
git submodule add ./subrepository

then open seperate remote repository in bit bucket then 
cd into ./subrepository
git remote add origin https://bitbucket.com/path/to/subrepository.git

基本上就是这样。

我没有关于我所知道的子树的详细信息,它比子模块更高级。但是如果你的需求基本上与子模块相匹配,它很容易维护。

【讨论】:

我希望外部仓库的分支指向内部仓库的相同分支......我将如何实现这一目标 我认为不可能,因为主repo和子模块是2个不同的repositories,所以分支是基于repository的,你不能这样实现。但是,当您将存储库添加为子模块时,主存储库会跟踪子模块提交哈希,因此,当您在子模块中添加任何提交时,您会在主存储库中看到任何分支,都会为子模块更改最后一次提交哈希。所以基本上主分支也跟随子模块。但这与分支无关。那你为什么需要那个?有没有什么特别的办法。

以上是关于在另一个 git 存储库中维护一个 Git 存储库的主要内容,如果未能解决你的问题,请参考以下文章

将 Visual Studio 项目放在 git 存储库中,并在 networkdrive 上添加远程(裸机?)源

GIT 原理简介

GIT 原理简介

Git存储库中的Git存储库[重复]

裸存储库中的 git ls-files

如何转换 git 存储库中的大量提交 [重复]