如何将第三方库导入Git?

12

我正在研究如何将第三方代码导入git仓库。 第三方代码是由ST提供的"stm32f10x_stdperiph_lib"。

该库实际上是一堆普通的c文件(和头文件),当你做STM32项目时,你只需包含并构建它们。

问题在于他们只提供zip文件,并且会发布新版本,因此我想增加更多控制。

因此,我的计划是编写一个小脚本来执行以下操作:

  1. 解压缩
  2. 获取一些文件(我不需要zip中包含的所有文件)
  3. 将选定的文件导入到git仓库

我的问题始于最后一步,如何导入并覆盖旧文件以及删除不再包含的文件?

4个回答

24
您要寻找的是"供应商分支"。假设您想要在此代码上工作,并将供应商的更新与自己的补丁合并,以下是使此过程变得容易的方法。
git checkout -b vendor    # create a vendor branch and check it out

这只是一次性的事情。 "vendor"分支仅包含来自第三方供应商的更新,您永远不会在"vendor"分支上进行开发工作,它只包含供应商代码的干净历史记录。 "vendor"名称并没有什么特别之处,只是我从CVS遗留下来的术语而已。

现在我们将把来自供应商的最新版本放入其中。

find . -not -path *.git* -and -not -path . -delete  # delete everything but git files
dump the 3rd party code into the project directory  # I'll leave that to you
git add .                              # add all the files, changes and deletions
git commit -a -m 'Vendor update version X.YY'   # commit it
git tag 'Vendor X.YY'                  # optional, might come in handy later

我们首先删除所有内容,以便Git可以看到供应商删除的内容。与Subversion相比,Git能够查看删除的文件并猜测移动的文件,使得这个过程更加简单。

现在您切换回开发分支(我假设是主分支),将供应商的更改合并到其中。

git checkout master
git merge vendor

像平常一样处理任何冲突。你的修补版本现在已经与供应商保持同步。像往常一样在主分支上工作。

下次供应商发布新版本时,重复这个过程。这利用了git出色的合并功能,使你的补丁保持与供应商更改的同步。


1
这里有一点魔鬼的辩护,但你真的需要将它作为一个git仓库吗?
也许可以设置一个脚本来下载和更新项目中的所有第三方代码?我的想法是,你最终会遇到一些难以导入的第三方依赖项。例如,对于Python,我使用buildout安装所有依赖项。这样我就可以轻松地组合git、mercurial、subversion、zip文件、包等。
然而,像下面这样的东西应该可以工作:
$ cd repo
$ find . -not -path *.git* -and -not -path . -delete
$ unzip /tmp/thirdparty.zip
$ git add .
$ git commit -a 'Updated version'

也就是说,删除除了.git目录和.gitignore之外的所有文件,以处理第三方项目中已删除文件的情况。然后将更新的压缩文件解压到目录中。将任何新文件添加到仓库中。提交更改。

希望对你有所帮助!:)


由于它们在压缩文件中具有相同的名称(即使内容发生更改),我认为仅仅下载并解压是很危险的,最好还是小心谨慎。 - Johan
1
我明白了。但是,你不必从互联网上下载它。你可以从一个内部服务器获取它,该服务器仅包含经过测试和批准的版本。 - lemonad
1
为什么不使用 git clean 而是使用 find 命令来删除旧版本? - Jakub Narębski
1
@Jakub:git clean 只会删除未跟踪的文件,在这种情况下,我们希望同时删除已跟踪和未跟踪的文件。也就是说,一个版本可能包含文件 abc,而下一个版本可能没有。除非删除所有文件,否则 abc 将保留在项目中。我们希望将删除操作提交到版本控制系统。 - lemonad

0
我的偏好是创建一个Git仓库,定期更新它(git commit -a -m 'Update'),然后在我的项目中简单地链接它(作为目录(ln -s、junction等)或共享库)。对于不需要的文件,请使用.gitignore。

这听起来就像是他的计划,但他正在寻求如何替换旧文件为新文件,并根据需要添加和删除的帮助。 还要注意,有些项目附带了.gitignore文件。 - ysth

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接