12

我正在研究如何将一些第三方代码导入 git 存储库。第三方代码是 ST 提供的“stm32f10x_stdperiph_lib”。

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

问题是他们只提供它作为一个 zip 文件并且他们确实发布了新版本,所以我想添加更多控制。

所以我的计划是写一个小脚本来做这个:

  1. 解压
  2. 抓取一些文件(我不需要 zip 中的所有文件)
  3. 将选定的文件导入 git 存储库

我的问题从最后一步开始,如何导入并用新文件覆盖旧文件(并删除不再包含的文件)?

4

4 回答 4

24

您正在寻找的是“供应商分支”。假设您想要处理此代码并将供应商的更新与您自己的补丁合并,那么您可以通过以下方式轻松实现。

git checkout -b vendor    # create a vendor branch and check it out

这是一次性的事情。供应商分支及其仅包含来自第 3 方供应商的更新。您永远不会在供应商分支中工作,它包含供应商代码的干净历史记录。“供应商”这个名字没有什么神奇之处,它只是我的 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 可以看到供应商删除的内容。git 查看删除和猜测移动文件的能力使得这个过程比 Subversion 简单得多。

现在您切换回您的开发(我假设是大师)并合并供应商的更改。

git checkout master
git merge vendor

正常处理任何冲突。您的修补版本现在与供应商保持同步。像往常一样在master上工作。

下次有来自供应商的新版本时,重复该过程。这利用了 git 出色的合并功能,使您的补丁与供应商的变化保持同步。

于 2009-11-08T22:20:35.690 回答
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。这是为了处理第三方项目中删除文件的情况。然后将更新的 zip 文件解压缩到目录中。将任何新文件添加到存储库。犯罪。

希望有帮助!:)

于 2009-11-08T10:46:21.050 回答
0

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

于 2009-11-08T10:51:25.540 回答
-1

我是 Git 新手,但是像 Piston 这样的东西不是更好的解决方案吗?http://piston.rubyforge.org/

于 2010-12-10T18:36:38.037 回答