大约一年前,我在与社区交谈的基础上实施了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
?还是我当时没有写下一些我想念的东西?
答案 0 :(得分:0)
检出B
分支中的最新节点,然后运行命令git checkout -b vendor
。这将使该节点成为vendor
分支的HEAD。其他一切都应该正常工作。
答案 1 :(得分:0)
维护供应商克隆,而不是维护供应商分支。制作自己的第3方库的git克隆。修补它并使其保持最新状态,就像其他任何存储库的分支一样。这将维护您的项目与维护第三方库的分支完全区分开。您可以对所做的更改运行其完整的测试套件,轻松地从上游获取更新,甚至在上游共享您的工作。
一旦您的第3方库位于其自己的存储库中,就可以使用现有工具将其作为依赖项进行管理。
此第三方库是一个依赖项,与Git hack相比,依赖项管理器可以更好地处理依赖项。一个好的依赖管理器将为您的项目解决所有其他问题。
您使用哪种方式取决于您的语言,框架和环境。许多可以直接取决于您的Git克隆甚至特定的分支和标签。例如,这里是Ruby's Bundler,具体取决于nokogiri
从https://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 submodules。将供应商克隆作为子模块链接到您的项目中。
git submodule add https://git.example.com/3rdparty/project_name vendor/project_name
现在vendor/party_project/
将在项目中显示为包含第三方库的子目录。您可以控制检出的提交并根据需要进行更新。
子模块确实使您的项目难于使用。首选真正的依赖项管理器。