使用 Git

来自 PostgreSQL Wiki
(从 Working with git 重定向)
跳转到导航跳转到搜索

此页面收集了关于使用 PostgreSQL Git 仓库 的各种智慧。你可能还会使用 其他 Git 仓库,最值得注意的是官方 Github 镜像,你可以fork到该网站。

入门

一个简单的入门方法可能看起来像这样

git clone https://git.postgresql.org/git/postgresql.git
cd postgresql
git checkout -b my-cool-feature
$EDITOR
git commit -a
git diff --patience master my-cool-feature > ../my-cool-feature.patch

注意 git checkout -b my-cool-feature 同时创建了一个新分支并检出它。通常,你会在不同的分支上开发每个功能。

请参阅 https://git.js.cn/doc/ext 上的文档和教程,以获取更详细的 Git 简介。对于更详细的课程,请查看 Pro Git 书籍,并可能获取一本实体书以帮助支持该网站。

你可能希望将以下内容放在你的 .git/info/exclude GitExclude 中。现在主仓库已经转换为 git,标准的 .gitignore 文件应该涵盖所有构建产品,因此你不需要上面引用中列出的大部分内容。你可能仍然希望排除 *~, tags 和 /cscope.out。

保持本地主分支同步

首先,添加 origin 作为远程仓库。你只需要做一次

git remote add origin https://git.postgresql.org/git/postgresql.git

接下来,从你的公共 git 仓库中获取

git fetch origin master

合并来自你的公共仓库的任何新补丁

git merge FETCH_HEAD

合并来自主分支的任何更改

git fetch origin master
git merge FETCH_HEAD

现在检查它是否仍然可以编译,通过回归测试等。确保你已调用 ./configure,然后

make check
make maintainer-clean

假设一切都好,进行一个预演。

git push --dry-run origin master

如果没问题,把它推送到你的公共仓库。

git push origin master

如果没有,修复任何合并失败,进行另一个预演,然后推送。

跟踪其他分支

假设你很乐意跟踪 master,但你真的想跟踪 git.postgresql.org 上的任何其他潜在分支

git remote add <super-fun-branch> https://git.postgresql.org/super-fun-branch.git
git fetch super-fun-branch
git checkout super-fun-branch #this will stage your remote branch for a local checkout
git checkout -b super-fun-branch-name #the name can be wahtever you choose

现在你拥有了本地 git 仓库中跟踪不同分支历史记录的本地分支。最重要的是,如果你需要,现在可以推送到那个仓库,而无需明确克隆来跟踪历史记录。与 master 分支共享一些共同的历史记录几乎是不可能的。

使用后备分支

由于 git 仓库包含 PostgreSQL 每个主要版本的各个分支,因此可以轻松地使用旧版本的最新代码,而不是当前版本。以下是列出可能性并检出旧版本的方法

 git branch -r
 git checkout -b REL_15_STABLE origin/REL_15_STABLE

请注意,如果你已经检出并使用了更高版本,你可能需要清理它留下的某些文件。建议运行

 make maintainer-clean

尽可能清除它们。你可能需要在 git 允许你进行检出之前删除某些遗留文件(对于上面的特定示例,src/interfaces/ecpg/preproc/preproc.y 可能有问题)。

测试补丁

这是一个典型的设置,用于检查补丁文本文件,通常由电子邮件发送

git checkout -b feature-to-review
patch -p1 < feature.patch

如果补丁无法应用,将留下 file.rej 文件,显示未应用的部分。如果你的目录树没有构建信息,你可以使用以下方法轻松找到它们

git status

补丁清理

补丁 diff 提交在作者对实际补丁进行一轮自我审查时效果最好 - 不仅仅是代码,还有生成的物理 diff 文件。 创建干净的补丁 涵盖了通常用于生成更好的补丁 diff 输出的实践。

发布你的工作

如果你在较长时间内开发了一个功能,则希望允许进行中间审查。传统的做法是通过电子邮件发送大型补丁。我们想尝试的更高级的方法(另请参见 Peter Eisentraut 的 博客条目)是将你的 Git 分支推送到 git.postgresql.org 上的私有区域,其他人可以在那里拉取你的工作,使用熟悉的 Git 工具对其进行操作,甚至可能将改进作为 Git 格式的补丁发送给你。有关如何注册以及如何使用仓库的说明,请参阅 git.postgresql.org 网站。你可能最终需要通过电子邮件创建补丁,作为正式 提交补丁 的一部分。

推送新分支

如果你创建了一个新分支,通常是为了进行新的功能测试,则需要将其推送到 git.postgresql.org。

 git push origin new_feature_branch

请注意,如果你有一个完全空白的仓库,那么即使是“master”分支也不会存在,也需要推送。

如果你在使用 postgresql 核心代码,请不要随意创建自己的分支并推送它们,在 pgsql-hackers 列表上先进行澄清。通常,你应该使用你的私有仓库区域。

删除分支

一旦你的功能被提交到 PostgreSQL 仓库,你通常可以删除本地功能分支。方法如下

# switch to a different branch
git checkout master
git branch -D my-cool-feature

使用 git hooks

Git hooks 是在发生某些事件(例如提交或推送)时运行的脚本。它们放置在你的 .git/hooks 目录中。这是一个示例脚本,用于检查你在提交时代码是否已正确缩进,并可选地为你重新缩进(通过将 PGAUTOINDENT 环境变量设置为 yes)。要使用此脚本,请将其放在 .git/hooks/pre-commit 中,并使用 chmod +x .git/hooks/pre-commit 使其可执行

#!/bin/sh
set -u
: ${PGAUTOINDENT:=no}

# the files in the commit
if git diff --cached --name-only --diff-filter=ACMR | grep src/tools/pgindent/typedefs.list > /dev/null; then
    # if typedefs.list is changed, we need to re-run pgindent on all files
    files='src contrib'
else
    files=$(git diff --cached --name-only --diff-filter=ACMR)
fi

check_indent () {
  # no need to filter files - pgindent ignores everything that isn't a
  # .c or .h file

  if [ "$PGAUTOINDENT" = yes ] ; then
    TEMPFILE=$(mktemp)
    trap "rm $TEMPFILE" EXIT
    if ! src/tools/pgindent/pgindent --check --diff $files > $TEMPFILE; then
      patch -p0 < $TEMPFILE
      echo "Commit abandoned. Rerun git add+commit to adopt pgindent changes"
      exit 1
    fi
  elif ! src/tools/pgindent/pgindent --check $files; then
    echo 'You need a pgindent run, e.g:'
    echo -n 'src/tools/pgindent/pgindent '
    if [ $files = 'src contrib' ]; then
        echo $files
    else
        echo '$(git diff --name-only --diff-filter=ACMR)'
    fi
    exit 1
  fi
  
}

# nothing to do if there are no files
test -z "$files" && exit 0
check_indent

使用 users/foo/postgres.git

在 git.postgresql.org 上请求项目时,一个选择是拥有主 postgresql 仓库的克隆。

这是一个非常棒的功能,但是你如何同步上游代码?

一种方法是在你自己的仓库中创建一个 git 克隆,并添加一个新的远程仓库来处理同步

# clone your repos
git clone ssh://[email protected]/users/foo/postgres.git my_postgres
# add a new remote
git remote add pgmaster https://git.postgresql.org/git/postgresql.git
# track some old versions
git checkout -b REL8_3_STABLE origin/REL8_3_STABLE
git checkout -b REL8_4_STABLE origin/REL8_4_STABLE
# change the remote of master and our old versions tracked
git config branch.REL8_3_STABLE.remote pgmaster
git config branch.REL8_4_STABLE.remote pgmaster
git config branch.master.remote pgmaster
# pull from postgres official git for each branch
# and finally push to origin
git checkout master
git pull
git push origin
git checkout REL8_3_STABLE
git pull
git push origin
git checkout REL8_4_STABLE
git pull
git push origin


这样,每个分支的 PostgreSQL 都很容易同步。从官方仓库拉取,并推送到你自己的仓库。

创建你自己的分支,并像往常一样工作。拥有 postgresql.git 本地克隆的用户可以在他们的仓库中添加你的分支,并愉快地合并,就像你一样。

使用 Web 界面

尝试使用 https://git.postgresql.org/ 上的 Web 界面。它提供浏览、"blame" 功能、快照和其他高级功能,并且比 CVSweb 快得多。即使你对 Git 或版本控制系统不感兴趣,你可能也会喜欢 Web 界面。

RSS 订阅

Git 服务提供 RSS 订阅,用于报告对仓库的提交。有些人可能会发现这是订阅 pgsql-committers 邮件列表的替代方法。PostgreSQL 仓库的 RSS 订阅 URL 是 https://git.postgresql.org/gitweb/?p=postgresql.git;a=rss。还提供了其他选项;可以在 Web 界面的 主页 上找到它们。

PostgreSQL 样式

PostgreSQL 源代码使用 4 个字符的制表符,使 git diff 的输出看起来很奇怪。你可以通过将此代码放入你的 .git/config 文件中来解决此问题

 [core]
   pager = less -x4

继续“rsync CVSROOT”工作流

Aidan van Dyk 发布了一个很好的教程,介绍了如何使用单个历史对象副本保留多个分支。这大致相当于保留多个 rsync'ed CVSROOT 副本的检出,这是某些提交者使用 CVS 时所习惯的做法。