Подтвердить что ты не робот

Как я могу переименовать тэг git?

У меня есть смятие с неправильным именем. Я хотел бы исправить имя так, чтобы оно было точным.

Как переименовать кошелек?

4b9b3361

Ответ 1

Предположим, что ваш тайник выглядит следующим образом:

$ git stash list
[email protected]{0}: WIP on master: Add some very important feature 
[email protected]{1}: WIP on master: Fix some silly bug

Сначала вы должны удалить запись, которую хотите переименовать:

$ git stash drop [email protected]{1}
Dropped [email protected]{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)

Теперь просто добавьте его снова с новым сообщением, используя sha of commit, возвращенный после удаления:

$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db

И что он:

$ git stash list
[email protected]{0}: Very descriptive message
[email protected]{1}: WIP on master: Add some very important feature

Для этого решения требуется git 1.8.4 или новее, и да, он также работает с грязным рабочим каталогом.

Ответ 2

Если вы не сделаете это вручную или не внесете улучшения в Git, вы можете использовать псевдоним:

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "[email protected]" && [ $s != 0 ] && git stash pop [email protected]{1}; }; _'

Использование: "git stash-rename <stash> [save options] [<message>]"

С [save options] любая опция git stash save: [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]

Пример:

$ git stash list
[email protected]{0}: On master: Pep8 format
[email protected]{1}: On master: co other than master with local changes
[email protected]{2}: On master: tests with deployAtEnd

# Let say I want to rename the [email protected]{2} adding an issue reference:
$ git stash-rename [email protected]{2} NXP-13971-deployAtEnd

$ git stash list
[email protected]{0}: On master: NXP-13971-deployAtEnd
[email protected]{1}: On master: Pep8 format
[email protected]{2}: On master: co other than master with local changes

Это будет работать, даже если у вас есть локальные неустановленные изменения:)

EDIT 2016/02/22

Упрощенный script, кредиты для qzb, fooobar.com/questions/53361/...

git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'

Использование: "git stash-rename <stash> [<message>]"

Ответ 3

Я не думаю, что это возможно. Было предложено предложение о переименовании прошивки, но оно еще не реализовано.

Моя общая идея:

  • Внедрить новую команду git reflog update, которая обновляет сообщение, связанное с определенной записью reflog. Для этого новая функция update_reflog_ent() (в reflog.c) изменит сообщение, связанное с конкретной записью reflog для обновления. Функция update_reflog() использовала бы for_each_reflog_ent() с update_reflog_ent для фактического изменения.

  • Теперь команда git stash rename должна вызвать только git reflog update с соответствующим сообщением ref и новым сообщением.

Или вы могли бы, конечно, вскрыть тайник и сделать git stash save [message]

Ответ 4

Для удобства читателя, это расширение принятого и правильного ответа.

Если вы не только хотите исправить сообщение о тайнике, но также хотите исправить сообщение о фиксации тайника, чтобы

git stash list

а также

git log --oneline -1 stash

оба согласны с тем, что показано, вам нужно немного больше. Возможно, есть лучший способ сделать это, но я надеюсь, что этот рецепт здесь легко понять.

Чтобы иметь возможность делать git commit --amend вы должны быть в СОВЕТЕ ветки. Следовательно, решение:

git checkout -b scratch [email protected]{1}
git stash drop [email protected]{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch

Разъяснение:

  • Создайте новую (еще не существующую) ветку "нуля" из "рассматриваемого тайника" и переключитесь на нее
  • Удалите старый тайник. Это безопасно, так как у нас все еще есть это на ветке.
  • Используйте git commit --amend для замены сообщения коммита, это изменяет SHA "тайника в вопросе"
  • Храните тайник, основываясь на ответе qzb
  • Вернитесь назад (что предполагает, что вы пришли от "мастера") и очистите

Недостатки:

  • Это временно переключает ветки. Таким образом, этот рецепт может применяться только тогда, когда git status --porcelain чистое (читай: ничего не выводится)

  • Он перенумеровывает тайники, поэтому измененный тайник становится [email protected]{0}

  • Вам нужно дважды ввести $MESSAGE или использовать некоторую переменную окружения (в примере: MESSAGE)

  • Вам нужно найти неиспользуемое название ветки

Есть способы сделать это без переключения веток, но это выходит за рамки этого ответа.

пример

git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list

Выход

*-.   e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
[email protected]{0}: WIP on master: 8bdcc32 D
[email protected]{1}: WIP on master: 8bdcc32 D

Теперь без изменения фиксации (обратите внимание: SHA в следующем будет отличаться на вашей стороне):

git stash drop [email protected]{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list

Выход

*-.   2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
[email protected]{0}: ...changed...
[email protected]{1}: WIP on master: 8bdcc32 D

Как вы видите, [email protected]{0} прежнему отображается как 2fbf900 (refs/stash) WIP on master: 8bdcc32 D в git log. Если вы посмотрите внимательно, вы увидите, что несколько коммитов изменили SHA. Это связано с тем, как обрабатываются тайники (родители включены в SHA, а тайники имеют свои тайники как родительские).

Исправьте это:

git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list

Выход

*-.   4d55186 (refs/stash) ...changed...
|\ \  
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/  
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
[email protected]{0}: ...changed...
[email protected]{1}: WIP on master: 8bdcc32 D

Как вы также можете видеть, refs/stash также изменил SHA.

Ответ 5

Это очень просто. Во-первых, отмените последний тайник с:

git stash pop

После этого вы можете сохранить тайник с настроенным именем следующим образом:

git stash save "your explanatory name"

Я надеюсь, что это полезно для вас. :)

Ответ 6

Ниже приведена измененная версия псевдонима Julien, которая позволяет корректно обрабатывать префикс On <branch>, обычно добавляемый к именам штампов:

git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"[email protected]{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'

Синтаксис:

git stash-rename <new-name> [<stash> [<new-branch-name> | .]]

Пример использования:

repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
[email protected]{0}: On master: second
[email protected]{1}: On master: first
repo[master] % git stash-rename renamed
[email protected]{0}: On master: renamed
[email protected]{1}: On master: first
repo[master] % git stash-rename also-renamed [email protected]{1}
[email protected]{0}: On master: also-renamed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename branch-changed [email protected]{0} new-branch
[email protected]{0}: On new-branch: branch-changed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
[email protected]{0}: On new-branch: branch-name-persists
[email protected]{1}: On master: renamed
repo[master] % git stash-rename no-branch [email protected]{0} .
[email protected]{0}: no-branch
[email protected]{1}: On master: renamed
repo[master] % git stash-rename renamed
[email protected]{0}: renamed
[email protected]{1}: On master: renamed
repo[master] % git stash-rename readd-branch [email protected]{0} develop
[email protected]{0}: On develop: readd-branch
[email protected]{1}: On master: renamed

Большая часть команды предназначена для разбора аргументов и определения того, что должно быть сделано для имени ветки. Используемые инструменты git:

  • git rev-parse <stash>, чтобы найти SHA кошелька.
  • git stash list --format=%gs -1 <stash>, чтобы найти объект лока. Обратите внимание, что это отличается от сообщения фиксации кошелька, который не изменяется этой командой. Объект reflog - это то, что отображается в git stash list, и вы можете изменить объект reflog без изменения хэшей коммитов, связанных с записями. Однако вы всегда можете найти исходное сообщение фиксации, поэтому не используйте git stash-rename для удаления конфиденциальной информации!
  • git stash drop <stash>, чтобы удалить старую ссылку на stash (но у нас все еще есть SHA, поэтому она не потеряна).
  • git stash store -m <new-message> <sha>, чтобы сохранить новую ссылку на тайник с одной и той же информацией о фиксации, но с другим объектом reflog.
  • git stash list, чтобы перечислить скобки после завершения операции. Обратите внимание, что новые штампы всегда помещаются в начало списка. Чтобы восстановить исходное положение, необходимо повторно нажать все штампы перед интересом, чтобы восстановить свое первоначальное положение.

Ответ 7

Простейший способ: вытащите свой кошелек с помощью git stash pop, затем сохраните его снова с помощью git stash save your-name