Git подписать предыдущие коммиты?

Мне было интересно, как подписать (-s) от предыдущих коммитов, которые я сделал в прошлом в git?

12 ответов

Решение

Чтобы подписать предыдущий коммит, используйте опцию исправления:

git commit --amend --signoff

В наши дни (начиная с Git 2.13) вы можете делать что-то вроде

git rebase --signoff HEAD~2

добавить Signed-off-by нижние колонтитулы до двух последних коммитов (в этом примере).

Попробуйте это, чтобы повторить старые коммиты с -S:

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

После этого вы должны git push -f, Но будьте осторожны, идентификаторы изменений изменятся, и другие люди станут не синхронизированными.

Если кто-то все еще ищет более автоматизированный способ подписания коммитов.

Попробуй это:

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

Это перебазирует все до хэша коммита (X коммитит)

потом git push -f требуется, чтобы вернуть изменение в истории обратно на удаленный

Для меня просто изменить signof, на самом деле не проверять мои коммиты на github.

Решение, которое работает для меня, возвращается назад, а затем подписывает каждый коммит -S

git commit --amend -S

Также, если вы проверяете, действительно ли ваш коммит подписан, а ваш адрес электронной почты / имя просто не добавлено, используйте эту команду

git show HEAD --show-signature

Дополнительный совет: если вы уже вносите изменения в свои коммиты, вы можете указать в них свое настоящее имя (см. Использование git log). Возможно, вы используете ваше имя дескриптора github, которое не нужно. Требуется только правильная электронная почта, и в поле имени пользователя вы должны использовать свое полное имя, и github будет отслеживать его правильно с вашим именем дескриптора github. Итак, чтобы исправить ваше имя пользователя и подписать последнее использование коммитов:

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

а также установить полное имя для имени пользователя в будущем

git config --global user.name "FULL NAME"

Интерактивная перебазировка с -S flag сделает свою работу.

Допустим, вам нужно подписать последние n коммитов (не забудьте проверить последний из этих n коммитов).

Бегать:

$ git rebase -i HEAD~n

Это дает список последних n совершает.

Теперь измените pick к edit префикс для всех коммитов, которые вы хотите подписать.

После этого закройте редактор. Откроется новый редактор со всем, что касается фиксации.

Поскольку в фиксации ничего менять не нужно, сохраните файл и выйдите из редактора. Вы также можете изменить сообщение фиксации, находясь в нем.

Повторите это для других коммитов.

Чтобы подтолкнуть новейшую историю, git push remote branch -f.

Принимая во внимание, что изменения изменяют сообщение коммита, использует 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 ваших существующих коммитов, и вам, возможно, придется принудительно подтолкнуть результат, что может быть проблематично, если ваши коммиты уже переданы другим.

У меня была похожая проблема. Здесь, благодаря Робину Джонсону из Gentoo Linux, есть хитрость, позволяющая добавить подпись ко всем моим предыдущим невыпущенным коммитам:

$ 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
$

Быстрое решение для подписания последнего X количества коммитов.

      git rebase --signoff @~X

Например, подписать последние 10 коммитов

      git rebase --signoff @~10

Я нашел это простое решение для своего случая. Источник: https://pmhahn.github.io/git-signoff/

Обходной путь, который не перезаписывает историю:

  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

Подпишите все неподписанные коммиты до определенного хеша коммита –

  1. Найдите самый ранний неподписанный коммит (хеш-фиксации), используя -
    git log --show-signature
  2. Команда Run -
    git rebase --exec 'git commit --amend --no-edit -n -S' -i commit-hash
  3. В интерактивной оболочке rebase нажмите -:x
  4. Это подпишет каждый коммит, начиная с самого последнего и заканчивая непосредственно перед хэшем коммита.
  5. (Необязательно) Устраните конфликты, если таковые имеются (git add <filename>=>git commit -S -m "message"=>git rebase --continue))
  6. Принудительно внесите изменения в источник git –
    git push -f

Я обнаружил, что этот подход сработал для меня, чтобы подписать конкретный коммит в вашей истории коммитов. Учитывая, что хеш фиксации для подписи известен:

      # Select the commit-hash to sign-off
$ git rebase -i <commit-hash>^

# Change the first commit’s action to ‘e’ or ‘edit’, then save and close the editor, then…

# Sign the specific commit.
$ git commit --amend --no-edit --signoff

# Continue the rebase
$ git rebase --continue
Другие вопросы по тегам