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/
Обходной путь, который не перезаписывает историю:
- создать новую ветку
- слить из старого с флагами
--no-commit --no-ff
-
git reset
удалить все коммиты ( подписанные или неподписанные ) -
git commit -S -am "commit message"
- нажмите новую ветку всего одним ПОДПИСАННЫМ коммитом
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
Подпишите все неподписанные коммиты до определенного хеша коммита –
- Найдите самый ранний неподписанный коммит (хеш-фиксации), используя -
git log --show-signature
- Команда Run -
git rebase --exec 'git commit --amend --no-edit -n -S' -i commit-hash
- В интерактивной оболочке rebase нажмите -
:x
- Это подпишет каждый коммит, начиная с самого последнего и заканчивая непосредственно перед хэшем коммита.
- (Необязательно) Устраните конфликты, если таковые имеются (
git add <filename>
=>git commit -S -m "message"
=>git rebase --continue
)) - Принудительно внесите изменения в источник 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