在git分支上管理一摞补丁
项目描述
git-pile
在git分支上管理一摞补丁
需求
- Python >= 3.7
- git >= 2.20
- Python模块
- argcomplete(可选,用于shell自动完成)
- coverage(可选,用于测试)
快速入门
运行git-pile
git-pile遵循git二进制命名约定,因此我们可以将其用作git的子命令。以下任一形式在git-pile在搜索PATH中时都有效
$ git pile -h
$ git-pile -h
为了使自动完成工作,您需要安装Python的argcomplete模块。在第一种情况下,您还需要源bash自动完成文件extra/git-pile-complete.sh
,以便git知道如何完成子命令。
您还可以将git-pile作为Python包安装,尽管这仍然不推荐,因为它经常更新。
$ ./setup.py install
或者
$ ./setup.py install --user
如果命令行中提供了--user
选项,它将在$HOME
目录下安装,bash自动完成文件将在$XDG_DATA_HOME/git-pile/bash_completion
。我们没有标准的bash自动完成用户目录可以安装,因此用户应该源此文件。
仓库初始化
初始化一个新的空摞
$ git pile init
现在您有一个(孤立)的摞分支,用于跟踪要管理的补丁文件。分支名称可以通过git pile init
的选项更改。与git init
创建一个新的仓库类似,git pile init
将创建一个新的摞。
或者,如果摞分支已经存在于远程仓库(甚至本地)中,并且您想设置您的工作树使用它,您应该使用下面的命令
$ git pile setup internal/pile internal/embargo-branch
在上面的示例中,我们有一个名为 internal
的远程分支,它包含名为 pile
的分支,其中包含补丁文件,以及一个名为 embargo-branch
的分支,该分支将在我们应用补丁时生成。
第二个参数是可选的,如果未提供,将使用当前分支。
开发新的提交并发送到邮件列表
您可以使用正常的git flow在项目中开发更改并创建提交。以下是一个示例,但并不限于git-pile
$ git checkout -b newfeature internal/embargo-branch
$ echo "platform 16" >> platforms.txt
$ git add platforms.txt
$ git commit "add new platform"
从初始化示例继续,我们创建一个新的分支,以 internal/embargo-branch
作为基础。结果可以像 git format-patch
一样准备发送到邮件列表
$ git pile format-patch -o /tmp/patches
/tmp/patches/0000-cover-letter.patch
/tmp/patches/0001-add-new-platform.patch
封面信将包含到 pile 分支的 diff(包括添加的补丁等),而补丁文件也将单独提供:这些是到结果分支的 diff,并提供以简化审查。
如果您要添加的提交不应该在顶部,而是在长期运行的补丁系列中间,您可以使用 git rebase -i
将它向下移动。以下示例中,我们将它向下移动10个提交
$ git rebase -i -11
[ editor opens and you move the commit around. You can also reorder
commits, edit commit message, etc, etc. Anything you do in an
interactive rebase you can do here ]
$ git pile format-patch -o /tmp/patches
/tmp/patches/0000-cover-letter.patch
/tmp/patches/0001-old-platform.patch
/tmp/patches/0002-old-platform-2.patch
/tmp/patches/0003-add-new-platform.patch
任何需要更改以适应系列中间补丁的补丁都将由 git pile format-patch
准备。
从更改的树生成 pile
您可以将分支的更改转换为 pile 分支中维护的物理补丁,而不是发送到邮件列表。
$ git pile genpatches master..newfeature
$ cd patches
$ git add -A
$ git commit -m "add platform"
$ git pile genbranch
这会生成补丁,保存补丁系列中的最终状态,然后重新创建本地 embargo-branch
。补丁可以重新排序,添加到中间,重新措辞等。通过执行 genpatches + genbranch 循环,我们总是可以重新生成分支并保持更改的历史,即保持补丁如何更改/添加/删除的历史。
将补丁系列应用到 pile
git-pile 生成的补丁系列中的封面信(即由 git pile format-patch
生成的)总是包含从树的原状态到当前状态的 diff。它可以用来通过定位补丁目录而不是正常工作目录来应用整个系列。
$ # machine 2
$ cd pile
$ git am /tmp/patches/0000-cover-letter.patch
$ git genbranch
这将应用接收到的整个系列(即使它是10个补丁系列,也只需要应用特别格式化的封面信)。
销毁 pile
如果出现任何问题并且您想从头开始,可以调用 destroy
命令。这将删除 git-pile 保存的所有配置,pile 分支本身以及它使用的 worktree 目录。如果您有补丁的备份(无论是手动备份还是 pile 分支在远程存储库中),这样做是相当安全的,并且允许您重新配置。
项目详情
下载文件
下载适合您平台的可执行文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。