98

我想知道如何签署(-s)我过去在 git 中所做的先前提交?

4

10 回答 10

132

要签署先前的提交,请使用 amend 选项:

git commit --amend --signoff

编辑:修改只签核最新的提交。签署多个提交,filter-branchinterpret-trailers按照vonc et 的建议。人。应该使用。这对我有用。

首先,配置 git 以将令牌替换signSigned-off-by. 这只需执行一次,并且在下一步中需要。

git config trailer.sign.key "Signed-off-by"

git filter-branch带有开关的命令--msg-filter将为每次提交评估一次过滤器。过滤器可以是任何在标准输入上接收提交消息并在标准输出上输出的 shell 命令。您可以编写自己的过滤器,或使用git interpret-trailers,这是无能为力的。这是一个示例,它将使用当前用户和电子邮件签署当前分支的最新两次提交:

export SIGNOFF="sign: $(git config --get user.name) <$(git config --get user.email)>"
git filter-branch -f --msg-filter \
    "git interpret-trailers --trailer \"$SIGNOFF\"" \
     HEAD~2..HEAD

--force注意 1) 修改提交消息会更改提交 ID,这意味着必须使用或更好的 --force-with-lease强制推送已发布的分支。

注意 2)如果您打算编写自定义脚本,请注意git filter-branch将当前目录更改为<repo>/.git-rewrite/t. 使用脚本的相对路径通常不起作用。相反,脚本应该在您的$PATH或作为绝对路径提供。

于 2013-03-27T19:22:56.463 回答
34

试试这个来重做旧的提交-S

git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD

之后,您必须git push -f. 但要小心,提交 id 会改变,其他人会变得不同步。

于 2014-12-09T19:39:57.257 回答
28

这些天(从Git 2.13开始)你通常可以做类似的事情

git rebase --signoff HEAD~2

为最后 2 次提交添加Signed-off-by页脚(在本例中)。

如果您的范围包括根提交,请将--root选项添加到rebase.

于 2020-09-14T12:08:05.257 回答
26

如果有人仍在寻找一种更好的自动化方式来签署提交。

尝试这个:

git rebase --exec 'git commit --amend --no-edit -n -S' -i commit-hash

这将重新设置所有内容,直到提交哈希(X 提交)

然后git push -f需要将历史记录的更改推回远程

于 2019-10-28T22:31:16.613 回答
13

对我来说只是修改signof,实际上并没有验证我在github上的提交。

对我有用的解决方案是回去,然后用-S

git commit --amend -S

此外,如果您检查您的提交是否实际签名,并且您的电子邮件/姓名根本没有附加,请使用此命令

git show HEAD --show-signature

额外提示: 如果您已经在修改您的提交,您可能希望在其中使用您的真实姓名(请参阅 using git log)。您可能正在使用您的 github 句柄名称,这不是必需的。只需要正确的电子邮件,在用户名字段中您应该使用您的全名,github 将使用您的 github 句柄名称正确跟踪它。因此,要更正您的用户名并签署最后一次提交,请使用:

git commit --amend --author="FULL NAME <email>" -S

并在未来为用户名设置全名

git config --global user.name "FULL NAME"
于 2017-06-25T18:03:27.830 回答
12

考虑签核修改提交消息,用于git filter-branch实现这一点。

git filter-branch --msg-filter \
    "cat - && echo && echo 'Signed-off-by: Dan McGee <email@example.com>'" \
    HEAD

(来自“git filter-branch魔术”的例子)

或者,按照Curt J. Sampson建议,使用git interpret-trailers

git config trailer.sign.key "Signed-off-by"
git filter-branch --msg-filter \
    "cat - && echo && git interpret-trailers --trailer 'sign: 'Signed-off-by: Dan McGee <email@example.com>'" \
    HEAD

警告:这将更改您现有提交的 SHA1,并且您可能必须强制推送结果,如果您的提交已经被其他人共享,这可能会出现问题。

vorburger在评论中添加了一个示例:

使用 git 版本 2.20.1,我不得不省略 " Signed-off-by" in --trailer 'sign:,并这样做:

git filter-branch --msg-filter \
  "cat - && echo && git interpret-trailers --trailer 'sign: Michael Vorburger <vorburger@redhat.com>'" \
  HEAD
于 2012-10-24T06:03:53.060 回答
9

-S带有标志的交互式变基将完成这项工作。

假设您需要签署最后的n次提交(确保签出最新的n次提交)。

跑:

$ git rebase -S -i HEAD~n

# The `-S` flag is important.
# It tells Git to sign the following commits.

这给出了最后一次n提交的列表。

现在,将 要签名的所有提交更改pick为前缀。edit

完成后,关闭编辑器。将打开一个新编辑器,其中包含有关提交的所有内容。

由于提交中不需要更改任何内容,请保存文件并退出编辑器。您还可以在提交消息时更改它。

对其他提交重复此操作。

推送最新历史,git push remote branch -f.

警告

有一个问题——它可以重写你的提交。

如果您签署一个 4 个月前的提交,它可能会覆盖其日期并使其看起来像是今天创建的。因此,当您想保留提交历史时,不建议这样做。

于 2020-03-21T17:13:26.100 回答
6

我有一个类似的问题。在这里,感谢来自 Gentoo Linux 的 Robin Johnson,这是一个将签名添加到我之前所有未推送提交的技巧:

$ git pull && git rebase --gpg-sign --force-rebase origin/master && git push --signed
Already up-to-date.
Current branch master is up to date, rebase forced.
First, rewinding head to replay your work on top of it...
Applying: sci-biology/KING: new package
Applying: dev-lang/yaggo: version bump, fix install procedure
Applying: sci-libs/htslib: version bump
Applying: sci-biology/bcftools: version bump
Applying: sci-biology/samtools: version bump
Applying: sci-biology/libBigWig: new release with io.h renamed to bigWigIO.h
Applying: sci-biology/MaSuRCA: add more URLs to HOMEPAGE
Applying: sci-biology/SPAdes: update comments on bundled dev-libs/boost
Applying: sci-biology/khmer: added a comment how to proceed with src_compile()
Applying: sci-biology/picard: version bump
Applying: sci-biology/ruffus: pint EGIT_REPO_URI to the archive URL of code.google.com
Applying: sci-biology/vcftools: the 0.1.15_pre release was just renamed to 0.1.15 by upstream
Applying: sci-biology/nanopolish: new package
Applying: sci-biology/libBigWig: version bump
Counting objects: 75, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (75/75), 14.51 KiB | 0 bytes/s, done.
Total 75 (delta 55), reused 0 (delta 0)
remote: To github.com:gentoo/sci.git
remote:    29c5e3f5d..b37457700  master -> master
To git+ssh://git.gentoo.org/proj/sci.git
   29c5e3f5d..b37457700  master -> master
$
于 2017-07-28T20:08:33.010 回答
3

不重写历史的解决方法:

  1. 创建一个新分支
  2. 从旧的与标志合并--no-commit --no-ff
  3. git reset删除所有提交(签名或未签名
  4. git commit -S -am "commit message"
  5. 只需一个签名提交即可推送新分支
git status
  ...
  On branch feature/branch_unsigned_commits
  ...
git checkout -b feature/branch_unsigned_commits_take2
git merge --no-commit --no-ff feature/branch_unsigned_commits
git reset
git commit -S -am "commit message"
git push
于 2021-08-24T09:23:22.487 回答
2

签署最后 X 次提交的快速解决方案。

git rebase --signoff @~X

例如,签署最后 10 个提交

git rebase --signoff @~10

我发现这对我的情况来说是一个简单的解决方案。来源:https ://pmhahn.github.io/git-signoff/

于 2021-04-15T01:26:07.790 回答