使用 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 时所习惯的做法。