如何在git中更轻松地引用第三方资源?

时间:2018-10-31 22:58:42

标签: git

大约一年前,我在与社区交谈的基础上实施了git策略来管理第三方库。那时我刚接触git。这需要创建一个孤立节点,添加源并将其合并到我们的源代码中。命令如下(摘自我的笔记):

cd /path/to/our/modified/source/directory              #1
git checkout --orphan vendor
rm -rf *                                               #2
cp -R /path/to/original/distribution/version/* .       #3
git add .                                              #4
git commit -m 'vendor vVersion'
git checkout merge-branch                              #5
rm -rf *
git reset --hard
git merge --allow-unrelated-histories -s ours vendor   #6

这将导致以下历史记录:

         ...A0--A1-...             dev
             \ /           
              C0                   merge-branch (transient)
             /           
            B0                     vendor

请注意merge-branch是一个临时分支,在合并回dev分支后将被删除。 Schwern将此分支称为feature,但由于它没有实际历史记录,因此名称无关紧要。这是仅在工作流程中使用的临时分支。

当时的想法是,我将添加到vendor分支,然后再次与以下命令合并(从我的笔记中获得):

cd /path/to/our/modified/source/directory              #1
git checkout vendor
rm -rf *                                               #2
cp -R /path/to/original/distribution/version/* .       #3
git add .                                              #4
git commit -m 'vendor vVersion'
git checkout merge-branch                              #5
git merge vendor                                       #6

结果:

         ...A0--A1-...-Ax--Ay--... dev
             \ /        \ /
              C0         Cz        merge-branch (transient)
             /          /
            B0---...---Bw--...     vendor

现在是时候添加一个新版本的第三方资源。但是,供应商分支似乎已经消失,或者我的注释有误。我发现,如果不是提交消息,那么我可能根本找不到分支。 B分支应该与主源分支A并行运行。但是,现在考虑到这一点,我不确定如何做到这一点。

我可以将git checkout vendor更改为git checkout <B0-hash>,但这没有意义,因为B0的源代码版本是A0。那么如何将其更新为版本Ax?还是我当时没有写下一些我想念的东西?

2 个答案:

答案 0 :(得分:0)

检出B分支中的最新节点,然后运行命令git checkout -b vendor。这将使该节点成为vendor分支的HEAD。其他一切都应该正常工作。

答案 1 :(得分:0)

建立供应商克隆

维护供应商克隆,而不是维护供应商分支。制作自己的第3方库的git克隆。修补它并使其保持最新状态,就像其他任何存储库的分支一样。这将维护您的项目与维护第三方库的分支完全区分开。您可以对所做的更改运行其完整的测试套件,轻松地从上游获取更新,甚至在上游共享您的工作。

一旦您的第3方库位于其自己的存储库中,就可以使用现有工具将其作为依赖项进行管理。

使用依赖项管理器

此第三方库是一个依赖项,与Git hack相比,依赖项管理器可以更好地处理依赖项。一个好的依赖管理器将为您的项目解决所有其他问题。

您使用哪种方式取决于您的语言,框架和环境。许多可以直接取决于您的Git克隆甚至特定的分支和标签。例如,这里是Ruby's Bundler,具体取决于nokogirihttps://github.com/rack/rack.git的Git存储库及其rack-1.5分支中提取。

gem 'nokogiri', git: 'https://github.com/rack/rack.git', branch: 'rack-1.5'

如果您的依赖项管理器不处理Git存储库,则它可能能够从tarball进行构建,或者您可能必须制作软件包。值得。

Git子模块

如果没有合适的依赖项管理器,则可以使用Git submodules。将供应商克隆作为子模块链接到您的项目中。

git submodule add https://git.example.com/3rdparty/project_name vendor/project_name

现在vendor/party_project/将在项目中显示为包含第三方库的子目录。您可以控制检出的提交并根据需要进行更新。

子模块确实使您的项目难于使用。首选真正的依赖项管理器。