gbs import

这个子命令可以把源代码或现有的源rpm包导入到git仓库。 这个命令大多用在初始化一个git仓库或升级代码包的时候。 它支持这些格式:源rpm, specfile和tarball。 关于使用import命令的详细用法,可以使用gbs import --help命令。

$ gbs import --help

导入源包

从源rpm包导入

$ gbs import sed-4.1.5-1/sed-4.1.5-1.src.rpm
info: No git repository found, creating one.
Initialized empty Git repository in /home/test/sed/.git/
info: Tag upstream/4.1.5 not found, importing Upstream upstream sources
info: Will create missing branch 'upstream'
pristine-tar: committed sed-4.1.5.tar.gz.delta to branch pristine-tar
info: Importing packaging files
info: Will create missing branch 'master'
info: Version '4.1.5-1' imported under 'sed'
info: done.
$ git tag
upstream/4.1.5
vendor/4.1.5-1
$ cd sed && git branch
* master
  pristine-tar
  upstream

从spec文件导入

$ gbs import sed-4.1.5-1/sed.spec
info: No git repository found, creating one.
Initialized empty Git repository in /home/test/sed/.git/
info: Tag upstream/4.1.5 not found, importing Upstream upstream sources
info: Will create missing branch 'upstream'
pristine-tar: committed sed-4.1.5.tar.gz.delta to branch pristine-tar
info: Importing packaging files
info: Will create missing branch 'master'
info: Version '4.1.5-1' imported under 'sed'
info: done.
$ cd sed && git branch
* master
  pristine-tar
  upstream
$ git tag
upstream/4.1.5
vendor/4.1.5-1

导入源包的特殊选项

如果源包包含补丁,gbs将试着在主分支的头部使用这些补丁:

$ cat sed-patch/sed.spec
...
URL:        http://sed.sourceforge.net/
Source0:    ftp://ftp.gnu.org/pub/gnu/sed/sed-%{version}.tar.gz
Source1001: packaging/sed.manifest
Patch0:     0001-hello.patch
%description
...
$ gbs import sed-patch/sed.spec
info: No git repository found, creating one.
Initialized empty Git repository in /home/test/sed/.git/
info: Tag upstream/4.1.5 not found, importing Upstream upstream sources
info: Will create missing branch 'upstream'
pristine-tar: committed sed-4.1.5.tar.gz.delta to branch pristine-tar
info: Importing packaging files
info: Will create missing branch 'master'
info: Importing patches to 'master' branch
info: Removing imported patch files from spec and packaging dir
info: Version '4.1.5-1' imported under 'sed'
info: done.
$ cd sed && git log --oneline
d94118f Autoremove imported patches from packaging
5d1333f hello
3a452d7 Imported vendor release 4.1.5-1
12104af Imported Upstream version 4.1.5
$ cat packaging/sed.spec
...
URL:        http://sed.sourceforge.net/
Source0:    ftp://ftp.gnu.org/pub/gnu/sed/sed-%{version}.tar.gz
Source1001: packaging/sed.manifest
%description
...

项--no-patch-import会使自动补丁导入失效,比如gbs将不会在主分支的头部使用这些补丁。 你应该手动打补丁或将其标记为手护(请见手动维护的补丁)。通过使用--native命令行选项,你可以将包指定为本地包,不带有独立的上游。 没有上游git分支被创建,并且假定包含打包文件的所有内容,都可以在源包的源tarball里面找到。 使用选项--allow-same-version,对于已经导入的版本,你可以重新导入。 这个选项将不会重新导入上游源,仅将packaging文件导入到主分支。 你可以使用--packaging-dir选项来为packaging文件定义目录,比如除了默认'packaging/'的其他目录。 如果上游源文件已经有一个目录名为'packaging',就需要使用这个选项。 如果要使用这个选项,你必须在.gbs.conf文件中定义这个设置(所有的相关分支),这样远程仓库和所有的用户都能得到这个正确的设置。

导入上游源文件

使用导入tar压缩包来升级包, gbs import仅在上游支存在的情况下工作。 一旦gbs import成功,将解压新的tar压包并导入到上游分支。 如果pristine-tar分支存在,tar包也会被导入到pristine-tar分支。

$ gbs import ../sed-4.2.0-1/sed-4.2.0.tar.gz
What is the upstream version? [4.2.0]
info: Importing '/home/test/sed-4.2.0-1/sed-4.2.0.tar.gz' to branch 'upstream'...
info: Source package is sed
info: Upstream version is 4.2.0
pristine-tar: committed sed-4.2.0.tar.gz.delta to branch pristine-tar
info: Successfully imported version 4.2.0 of /home/test/sed-4.2.0-1/sed-4.2.0.tar.gz
info: done.
test@test-desktop:~/sed$ git tag
upstream/4.1.5
upstream/4.2.0
$ git log --oneline
 d3d25a7 Imported vendor release 4.1.5-1
 1f6acaa Imported Upstream version 4.1.5
$ git checkout upstream && git log --oneline
 Switched to branch 'upstream'
 23220e6 Imported Upstream version 4.2.0
 1f6acaa Imported Upstream version 4.1.5
$ git checkout pristine-tar && git log --oneline
 Switched to branch 'pristine-tar'
 7d44dad pristine-tar data for sed-4.2.0.tar.gz
 71ee336 pristine-tar data for sed-4.1.5.tar.gz

导入上游源的特殊选项

如果你要将导入的上游分自动合并到主分支,可以使用--merge选项:

$ gbs import --merge ../sed-4.2.0-1/sed-4.2.0.tar.gz
What is the upstream version? [4.2.0]
info: Importing '/home/test/sed-4.2.0-1/sed-4.2.0.tar.gz' to branch 'upstream'...
info: Source package is sed
info: Upstream version is 4.2.0
pristine-tar: committed sed-4.2.0.tar.gz.delta to branch pristine-tar
info: Merging to 'master'
Merge made by recursive.
info: Successfully imported version 4.2.0 of /home/test/sed-4.2.0-1/sed-4.2.0.tar.gz
info: done.
$ git log --oneline
 cc58b4c Merge commit 'upstream/4.2.0'
 1f157c3 Imported Upstream version 4.2.0
 482ef23 Imported vendor release 4.1.5-1
 fc76416 Imported Upstream version 4.1.5

如果要直接跟踪上游git,但仍然想要导入官方发布的压缩包的时候,你可以使用--upstream-vcs-tag 选项。 通过使用这个选项,你可以获得上游git的完整git历史,保存到你的上游分支中。 而且,真正的上游git tag和发布的tarball之间的差别(如添加的autotool宏)会作为一个提交,在真正的上游git tag中显示出来。

导入源包和上游源的通用选项

这个章节描述了一些导入源文件包和上游源文件的高级命令行选项。 --upstream-branch选项可用来定义上游分支的名字。 如果你使用这个选项,你也应该在每个包特定的.gbs.conf中定义它(在所有相关的分支),类似于'--packaging-dir'选项。 --no-pristine-tar使得pristine-tar工具的使用失效。 即gbs不会将上游源tar压缩包导入到pristine-tar分支。 通过使用--filter选项,我们可以从上游源文件中过滤掉一些文件。 例如,你可能需要过滤掉来自上游tar压缩包的.git目录,使用--filter=.git。 这个选项可以多次使用。