diff --git a/docs/Config.md b/docs/Config.md
index 87ed70eed..d0d90ea31 100644
--- a/docs/Config.md
+++ b/docs/Config.md
@@ -223,6 +223,7 @@ keybinding:
viewBisectOptions: 'b'
stash:
popStash: 'g'
+ renameStash: 'r'
commitFiles:
checkoutCommitFile: 'c'
main:
diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md
index af5787dab..df42f5a62 100644
--- a/docs/keybindings/Keybindings_en.md
+++ b/docs/keybindings/Keybindings_en.md
@@ -238,6 +238,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: pop
d: drop
n: new branch
+ r: rename stash
enter: view selected item's files
diff --git a/docs/keybindings/Keybindings_ja.md b/docs/keybindings/Keybindings_ja.md
index d22f6d150..910b6938d 100644
--- a/docs/keybindings/Keybindings_ja.md
+++ b/docs/keybindings/Keybindings_ja.md
@@ -48,6 +48,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: pop
d: drop
n: 新しいブランチを作成
+ r: Stashを変更
enter: view selected item's files
diff --git a/docs/keybindings/Keybindings_ko.md b/docs/keybindings/Keybindings_ko.md
index 690cd5790..2edef93ff 100644
--- a/docs/keybindings/Keybindings_ko.md
+++ b/docs/keybindings/Keybindings_ko.md
@@ -63,6 +63,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: pop
d: drop
n: 새 브랜치 생성
+ r: rename stash
enter: view selected item's files
diff --git a/docs/keybindings/Keybindings_nl.md b/docs/keybindings/Keybindings_nl.md
index 15484be73..06b96af5c 100644
--- a/docs/keybindings/Keybindings_nl.md
+++ b/docs/keybindings/Keybindings_nl.md
@@ -238,6 +238,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: pop
d: laten vallen
n: nieuwe branch
+ r: rename stash
enter: bekijk gecommite bestanden
diff --git a/docs/keybindings/Keybindings_pl.md b/docs/keybindings/Keybindings_pl.md
index 9cfc64294..a1ca9cfd2 100644
--- a/docs/keybindings/Keybindings_pl.md
+++ b/docs/keybindings/Keybindings_pl.md
@@ -231,6 +231,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: wyciągnij
d: porzuć
n: nowa gałąź
+ r: rename stash
enter: przeglądaj pliki commita
diff --git a/docs/keybindings/Keybindings_zh.md b/docs/keybindings/Keybindings_zh.md
index df1db2e55..98b180a52 100644
--- a/docs/keybindings/Keybindings_zh.md
+++ b/docs/keybindings/Keybindings_zh.md
@@ -264,6 +264,7 @@ _This file is auto-generated. To update, make the changes in the pkg/i18n direct
g: 应用并删除
d: 删除
n: 新分支
+ r: rename stash
enter: 查看提交的文件
diff --git a/pkg/commands/git_commands/stash.go b/pkg/commands/git_commands/stash.go
index c0d187a13..9c7321b50 100644
--- a/pkg/commands/git_commands/stash.go
+++ b/pkg/commands/git_commands/stash.go
@@ -2,6 +2,7 @@ package git_commands
import (
"fmt"
+ "strings"
"github.com/jesseduffield/lazygit/pkg/commands/loaders"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
@@ -46,6 +47,19 @@ func (self *StashCommands) Save(message string) error {
return self.cmd.New("git stash save " + self.cmd.Quote(message)).Run()
}
+func (self *StashCommands) Store(sha string, message string) error {
+ trimmedMessage := strings.Trim(message, " \t")
+ if len(trimmedMessage) > 0 {
+ return self.cmd.New(fmt.Sprintf("git stash store %s -m %s", self.cmd.Quote(sha), self.cmd.Quote(trimmedMessage))).Run()
+ }
+ return self.cmd.New(fmt.Sprintf("git stash store %s", self.cmd.Quote(sha))).Run()
+}
+
+func (self *StashCommands) Sha(index int) (string, error) {
+ sha, _, err := self.cmd.New(fmt.Sprintf("git rev-parse refs/stash@{%d}", index)).DontLog().RunWithOutputs()
+ return strings.Trim(sha, "\r\n"), err
+}
+
func (self *StashCommands) ShowStashEntryCmdObj(index int) oscommands.ICmdObj {
cmdStr := fmt.Sprintf("git stash show -p --stat --color=%s --unified=%d stash@{%d}", self.UserConfig.Git.Paging.ColorArg, self.UserConfig.Git.DiffContextSize, index)
@@ -109,3 +123,21 @@ func (self *StashCommands) SaveStagedChanges(message string) error {
return nil
}
+
+func (self *StashCommands) Rename(index int, message string) error {
+ sha, err := self.Sha(index)
+ if err != nil {
+ return err
+ }
+
+ if err := self.Drop(index); err != nil {
+ return err
+ }
+
+ err = self.Store(sha, message)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/pkg/commands/git_commands/stash_test.go b/pkg/commands/git_commands/stash_test.go
index b41f7815b..1a4e50822 100644
--- a/pkg/commands/git_commands/stash_test.go
+++ b/pkg/commands/git_commands/stash_test.go
@@ -10,7 +10,7 @@ import (
func TestStashDrop(t *testing.T) {
runner := oscommands.NewFakeRunner(t).
- ExpectGitArgs([]string{"stash", "drop", "stash@{1}"}, "", nil)
+ ExpectGitArgs([]string{"stash", "drop", "stash@{1}"}, "Dropped refs/stash@{1} (98e9cca532c37c766107093010c72e26f2c24c04)\n", nil)
instance := buildStashCommands(commonDeps{runner: runner})
assert.NoError(t, instance.Drop(1))
@@ -44,6 +44,59 @@ func TestStashSave(t *testing.T) {
runner.CheckForMissingCalls()
}
+func TestStashStore(t *testing.T) {
+ type scenario struct {
+ testName string
+ sha string
+ message string
+ expected []string
+ }
+
+ scenarios := []scenario{
+ {
+ testName: "Non-empty message",
+ sha: "0123456789abcdef",
+ message: "New stash name",
+ expected: []string{"stash", "store", "0123456789abcdef", "-m", "New stash name"},
+ },
+ {
+ testName: "Empty message",
+ sha: "0123456789abcdef",
+ message: "",
+ expected: []string{"stash", "store", "0123456789abcdef"},
+ },
+ {
+ testName: "Space message",
+ sha: "0123456789abcdef",
+ message: " ",
+ expected: []string{"stash", "store", "0123456789abcdef"},
+ },
+ }
+
+ for _, s := range scenarios {
+ s := s
+ t.Run(s.testName, func(t *testing.T) {
+ runner := oscommands.NewFakeRunner(t).
+ ExpectGitArgs(s.expected, "", nil)
+ instance := buildStashCommands(commonDeps{runner: runner})
+
+ assert.NoError(t, instance.Store(s.sha, s.message))
+ runner.CheckForMissingCalls()
+ })
+ }
+}
+
+func TestStashSha(t *testing.T) {
+ runner := oscommands.NewFakeRunner(t).
+ ExpectGitArgs([]string{"rev-parse", "refs/stash@{5}"}, "14d94495194651adfd5f070590df566c11d28243\n", nil)
+ instance := buildStashCommands(commonDeps{runner: runner})
+
+ sha, err := instance.Sha(5)
+ assert.NoError(t, err)
+ assert.Equal(t, "14d94495194651adfd5f070590df566c11d28243", sha)
+ runner.CheckForMissingCalls()
+}
+
func TestStashStashEntryCmdObj(t *testing.T) {
type scenario struct {
testName string
@@ -79,3 +132,50 @@ func TestStashStashEntryCmdObj(t *testing.T) {
})
}
}
+
+func TestStashRename(t *testing.T) {
+ type scenario struct {
+ testName string
+ index int
+ message string
+ expectedShaCmd []string
+ shaResult string
+ expectedDropCmd []string
+ expectedStoreCmd []string
+ }
+
+ scenarios := []scenario{
+ {
+ testName: "Default case",
+ index: 3,
+ message: "New message",
+ expectedShaCmd: []string{"rev-parse", "refs/stash@{3}"},
+ shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
+ expectedDropCmd: []string{"stash", "drop", "stash@{3}"},
+ expectedStoreCmd: []string{"stash", "store", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd", "-m", "New message"},
+ },
+ {
+ testName: "Empty message",
+ index: 4,
+ message: "",
+ expectedShaCmd: []string{"rev-parse", "refs/stash@{4}"},
+ shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
+ expectedDropCmd: []string{"stash", "drop", "stash@{4}"},
+ expectedStoreCmd: []string{"stash", "store", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
+ },
+ }
+
+ for _, s := range scenarios {
+ s := s
+ t.Run(s.testName, func(t *testing.T) {
+ runner := oscommands.NewFakeRunner(t).
+ ExpectGitArgs(s.expectedShaCmd, s.shaResult, nil).
+ ExpectGitArgs(s.expectedDropCmd, "", nil).
+ ExpectGitArgs(s.expectedStoreCmd, "", nil)
+ instance := buildStashCommands(commonDeps{runner: runner})
+
+ err := instance.Rename(s.index, s.message)
+ assert.NoError(t, err)
+ })
+ }
+}
diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go
index f3ff1befb..a90b100d5 100644
--- a/pkg/config/user_config.go
+++ b/pkg/config/user_config.go
@@ -265,7 +265,8 @@ type KeybindingCommitsConfig struct {
}
type KeybindingStashConfig struct {
- PopStash string `yaml:"popStash"`
+ PopStash string `yaml:"popStash"`
+ RenameStash string `yaml:"renameStash"`
}
type KeybindingCommitFilesConfig struct {
@@ -547,7 +548,8 @@ func GetDefaultConfig() *UserConfig {
ViewBisectOptions: "b",
},
Stash: KeybindingStashConfig{
- PopStash: "g",
+ PopStash: "g",
+ RenameStash: "r",
},
CommitFiles: KeybindingCommitFilesConfig{
CheckoutCommitFile: "c",
diff --git a/pkg/gui/controllers/stash_controller.go b/pkg/gui/controllers/stash_controller.go
index 6c8e7c349..68a121931 100644
--- a/pkg/gui/controllers/stash_controller.go
+++ b/pkg/gui/controllers/stash_controller.go
@@ -4,6 +4,7 @@ import (
"github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/gui/context"
"github.com/jesseduffield/lazygit/pkg/gui/types"
+ "github.com/jesseduffield/lazygit/pkg/utils"
)
type StashController struct {
@@ -44,6 +45,11 @@ func (self *StashController) GetKeybindings(opts types.KeybindingsOpts) []*types
Handler: self.checkSelected(self.handleNewBranchOffStashEntry),
Description: self.c.Tr.LcNewBranch,
},
+ {
+ Key: opts.GetKey(opts.Config.Stash.RenameStash),
+ Handler: self.checkSelected(self.handleRenameStashEntry),
+ Description: self.c.Tr.LcRenameStash,
+ },
}
return bindings
@@ -139,3 +145,27 @@ func (self *StashController) postStashRefresh() error {
func (self *StashController) handleNewBranchOffStashEntry(stashEntry *models.StashEntry) error {
return self.helpers.Refs.NewBranch(stashEntry.RefName(), stashEntry.Description(), "")
}
+
+func (self *StashController) handleRenameStashEntry(stashEntry *models.StashEntry) error {
+ message := utils.ResolvePlaceholderString(
+ self.c.Tr.RenameStashPrompt,
+ map[string]string{
+ "stashName": stashEntry.RefName(),
+ },
+ )
+
+ return self.c.Prompt(types.PromptOpts{
+ Title: message,
+ InitialContent: stashEntry.Name,
+ HandleConfirm: func(response string) error {
+ self.c.LogAction(self.c.Tr.Actions.RenameStash)
+ err := self.git.Stash.Rename(stashEntry.Index, response)
+ _ = self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH}})
+ if err != nil {
+ return err
+ }
+ self.context().SetSelectedLineIdx(0) // Select the renamed stash
+ return nil
+ },
+ })
+}
diff --git a/pkg/i18n/chinese.go b/pkg/i18n/chinese.go
index fb594a1a9..67cf264ce 100644
--- a/pkg/i18n/chinese.go
+++ b/pkg/i18n/chinese.go
@@ -139,6 +139,8 @@ func chineseTranslationSet() TranslationSet {
SureApplyStashEntry: "您确定要应用此贮藏条目?",
NoTrackedStagedFilesStash: "没有可以贮藏的已跟踪/暂存文件",
StashChanges: "贮藏更改",
+ LcRenameStash: "rename stash",
+ RenameStashPrompt: "Rename stash: {{.stashName}}",
OpenConfig: "打开配置文件",
EditConfig: "编辑配置文件",
ForcePush: "强制推送",
@@ -530,6 +532,7 @@ func chineseTranslationSet() TranslationSet {
UpdateRemote: "更新远程",
ApplyPatch: "应用补丁",
Stash: "贮藏 (Stash)",
+ RenameStash: "Rename stash",
RemoveSubmodule: "删除子模块",
ResetSubmodule: "重置子模块",
AddSubmodule: "添加子模块",
diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go
index 536793fc6..4436d653c 100644
--- a/pkg/i18n/dutch.go
+++ b/pkg/i18n/dutch.go
@@ -105,6 +105,8 @@ func dutchTranslationSet() TranslationSet {
SureApplyStashEntry: "Weet je zeker dat je deze stash entry wil toepassen?",
NoTrackedStagedFilesStash: "Je hebt geen tracked/staged bestanden om te laten stashen",
StashChanges: "Stash veranderingen",
+ LcRenameStash: "rename stash",
+ RenameStashPrompt: "Rename stash: {{.stashName}}",
NoChangedFiles: "Geen veranderde bestanden",
OpenConfig: "open config bestand",
EditConfig: "verander config bestand",
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 08f737a51..75e121545 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -128,6 +128,8 @@ type TranslationSet struct {
NoTrackedStagedFilesStash string
NoFilesToStash string
StashChanges string
+ LcRenameStash string
+ RenameStashPrompt string
OpenConfig string
EditConfig string
ForcePush string
@@ -601,6 +603,7 @@ type Actions struct {
UpdateRemote string
ApplyPatch string
Stash string
+ RenameStash string
RemoveSubmodule string
ResetSubmodule string
AddSubmodule string
@@ -769,6 +772,8 @@ func EnglishTranslationSet() TranslationSet {
NoTrackedStagedFilesStash: "You have no tracked/staged files to stash",
NoFilesToStash: "You have no files to stash",
StashChanges: "Stash changes",
+ LcRenameStash: "rename stash",
+ RenameStashPrompt: "Rename stash: {{.stashName}}",
OpenConfig: "open config file",
EditConfig: "edit config file",
ForcePush: "Force push",
@@ -1226,6 +1231,7 @@ func EnglishTranslationSet() TranslationSet {
UpdateRemote: "Update remote",
ApplyPatch: "Apply patch",
Stash: "Stash",
+ RenameStash: "Rename stash",
RemoveSubmodule: "Remove submodule",
ResetSubmodule: "Reset submodule",
AddSubmodule: "Add submodule",
diff --git a/pkg/i18n/japanese.go b/pkg/i18n/japanese.go
index 03d949549..bfdf492f8 100644
--- a/pkg/i18n/japanese.go
+++ b/pkg/i18n/japanese.go
@@ -130,6 +130,8 @@ func japaneseTranslationSet() TranslationSet {
SureApplyStashEntry: "Stashを適用します。よろしいですか?",
// NoTrackedStagedFilesStash: "You have no tracked/staged files to stash",
StashChanges: "変更をStash",
+ LcRenameStash: "Stashを変更",
+ RenameStashPrompt: "Stash名を変更: {{.stashName}}",
OpenConfig: "設定ファイルを開く",
EditConfig: "設定ファイルを編集",
ForcePush: "Force push",
@@ -556,6 +558,7 @@ func japaneseTranslationSet() TranslationSet {
UpdateRemote: "リモートを更新",
ApplyPatch: "パッチを適用",
Stash: "Stash",
+ RenameStash: "Stash名を変更",
RemoveSubmodule: "サブモジュールを削除",
ResetSubmodule: "サブモジュールをリセット",
AddSubmodule: "サブモジュールを追加",
diff --git a/pkg/i18n/korean.go b/pkg/i18n/korean.go
index afda25c6d..573f22bdc 100644
--- a/pkg/i18n/korean.go
+++ b/pkg/i18n/korean.go
@@ -131,6 +131,8 @@ func koreanTranslationSet() TranslationSet {
SureApplyStashEntry: "정말로 Stash를 적용하시겠습니까?",
NoTrackedStagedFilesStash: "You have no tracked/staged files to stash",
StashChanges: "변경을 Stash",
+ LcRenameStash: "rename stash",
+ RenameStashPrompt: "Rename stash: {{.stashName}}",
OpenConfig: "설정 파일 열기",
EditConfig: "설정 파일 수정",
ForcePush: "강제 푸시",
@@ -561,6 +563,7 @@ func koreanTranslationSet() TranslationSet {
UpdateRemote: "Update remote",
ApplyPatch: "Apply patch",
Stash: "Stash",
+ RenameStash: "Rename stash",
RemoveSubmodule: "서브모듈 삭제",
ResetSubmodule: "서브모듈 Reset",
AddSubmodule: "서브모듈 추가",
diff --git a/pkg/i18n/polish.go b/pkg/i18n/polish.go
index e82ddc2de..8bcc460e1 100644
--- a/pkg/i18n/polish.go
+++ b/pkg/i18n/polish.go
@@ -83,6 +83,8 @@ func polishTranslationSet() TranslationSet {
SureDropStashEntry: "Jesteś pewny, że chcesz porzucić tę pozycję w schowku?",
NoTrackedStagedFilesStash: "Nie masz śledzonych/zatwierdzonych plików do przechowania",
StashChanges: "Przechowaj zmiany",
+ LcRenameStash: "rename stash",
+ RenameStashPrompt: "Rename stash: {{.stashName}}",
OpenConfig: "otwórz konfigurację",
EditConfig: "edytuj konfigurację",
ForcePush: "Wymuś wysłanie",
diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go
index 5f7fef350..1d8182edb 100644
--- a/pkg/integration/components/shell.go
+++ b/pkg/integration/components/shell.go
@@ -111,3 +111,8 @@ func (s *Shell) CreateNCommits(n int) *Shell {
return s
}
+
+func (s *Shell) StashWithMessage(message string) *Shell {
+ s.RunCommand(fmt.Sprintf(`git stash -m "%s"`, message))
+ return s
+}
diff --git a/pkg/integration/tests/stash/rename.go b/pkg/integration/tests/stash/rename.go
new file mode 100644
index 000000000..761d7135b
--- /dev/null
+++ b/pkg/integration/tests/stash/rename.go
@@ -0,0 +1,37 @@
+package stash
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var Rename = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Try to rename the stash.",
+ ExtraCmdArgs: "",
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {},
+ SetupRepo: func(shell *Shell) {
+ shell.
+ EmptyCommit("blah").
+ CreateFileAndAdd("file-1", "change to stash1").
+ StashWithMessage("foo").
+ CreateFileAndAdd("file-2", "change to stash2").
+ StashWithMessage("bar")
+ },
+ Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) {
+ input.SwitchToStashWindow()
+ assert.CurrentViewName("stash")
+
+ assert.MatchSelectedLine(Equals("On master: bar"))
+ input.NextItem()
+ assert.MatchSelectedLine(Equals("On master: foo"))
+ input.PressKeys(keys.Stash.RenameStash)
+ assert.InPrompt()
+ assert.MatchCurrentViewTitle(Equals("Rename stash: stash@{1}"))
+
+ input.Type(" baz")
+ input.Confirm()
+
+ assert.MatchSelectedLine(Equals("On master: foo baz"))
+ },
+})
diff --git a/pkg/integration/tests/tests.go b/pkg/integration/tests/tests.go
index 21f06a376..6b4583e6d 100644
--- a/pkg/integration/tests/tests.go
+++ b/pkg/integration/tests/tests.go
@@ -16,6 +16,7 @@ import (
"github.com/jesseduffield/lazygit/pkg/integration/tests/commit"
"github.com/jesseduffield/lazygit/pkg/integration/tests/custom_commands"
"github.com/jesseduffield/lazygit/pkg/integration/tests/interactive_rebase"
+ "github.com/jesseduffield/lazygit/pkg/integration/tests/stash"
)
// Here is where we lists the actual tests that will run. When you create a new test,
@@ -38,6 +39,7 @@ var tests = []*components.IntegrationTest{
cherry_pick.CherryPick,
cherry_pick.CherryPickConflicts,
custom_commands.FormPrompts,
+ stash.Rename,
}
func GetTests() []*components.IntegrationTest {
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration_new/stash/rename/expected/repo/.git_keep/COMMIT_EDITMSG
new file mode 100644
index 000000000..907b30816
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/COMMIT_EDITMSG
@@ -0,0 +1 @@
+blah
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/FETCH_HEAD b/test/integration_new/stash/rename/expected/repo/.git_keep/FETCH_HEAD
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/HEAD b/test/integration_new/stash/rename/expected/repo/.git_keep/HEAD
new file mode 100644
index 000000000..cb089cd89
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/ORIG_HEAD b/test/integration_new/stash/rename/expected/repo/.git_keep/ORIG_HEAD
new file mode 100644
index 000000000..6d340468f
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/ORIG_HEAD
@@ -0,0 +1 @@
+209b9fa9264fa15f128127817f080fd7372050cf
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/commit-template.txt b/test/integration_new/stash/rename/expected/repo/.git_keep/commit-template.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/config b/test/integration_new/stash/rename/expected/repo/.git_keep/config
new file mode 100644
index 000000000..8a748ce32
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/config
@@ -0,0 +1,12 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ ignorecase = true
+ precomposeunicode = true
+[user]
+ email = CI@example.com
+ name = CI
+[commit]
+ gpgSign = false
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/description b/test/integration_new/stash/rename/expected/repo/.git_keep/description
new file mode 100644
index 000000000..498b267a8
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/index b/test/integration_new/stash/rename/expected/repo/.git_keep/index
new file mode 100644
index 000000000..65d675154
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/index differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/info/exclude b/test/integration_new/stash/rename/expected/repo/.git_keep/info/exclude
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/logs/HEAD b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/HEAD
new file mode 100644
index 000000000..93b01e488
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/HEAD
@@ -0,0 +1,3 @@
+0000000000000000000000000000000000000000 209b9fa9264fa15f128127817f080fd7372050cf CI 1665905121 +0900 commit (initial): blah
+209b9fa9264fa15f128127817f080fd7372050cf 209b9fa9264fa15f128127817f080fd7372050cf CI 1665905122 +0900 reset: moving to HEAD
+209b9fa9264fa15f128127817f080fd7372050cf 209b9fa9264fa15f128127817f080fd7372050cf CI 1665905122 +0900 reset: moving to HEAD
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/heads/master
new file mode 100644
index 000000000..f1bfb4ca0
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/heads/master
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 209b9fa9264fa15f128127817f080fd7372050cf CI 1665905121 +0900 commit (initial): blah
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/stash b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/stash
new file mode 100644
index 000000000..5addb2d25
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/logs/refs/stash
@@ -0,0 +1,2 @@
+0000000000000000000000000000000000000000 a5272a200897df5558c8cad683c1af14f7184124 CI 1665905122 +0900 On master: bar
+a5272a200897df5558c8cad683c1af14f7184124 de8f5ed6f8a58664edfbdecd20b75a6ea0633bf6 CI 1665905125 +0900 On master: foo baz
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/20/9b9fa9264fa15f128127817f080fd7372050cf b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/20/9b9fa9264fa15f128127817f080fd7372050cf
new file mode 100644
index 000000000..b0b57c478
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/20/9b9fa9264fa15f128127817f080fd7372050cf
@@ -0,0 +1,3 @@
+x1
+0@>B]YXPB Sa9
+)ĸz]?~i;xza)ĥ0l*-ia )jFoi4ۣ:gwDwkOtϛ;+
\ No newline at end of file
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/43/a4e12864cee1d7020a6d22772f0be34a24d257 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/43/a4e12864cee1d7020a6d22772f0be34a24d257
new file mode 100644
index 000000000..12adb9b6f
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/43/a4e12864cee1d7020a6d22772f0be34a24d257 differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
new file mode 100644
index 000000000..adf64119a
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/65/d11c8b2d3c173850f337661c9bf264d0406cf1 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/65/d11c8b2d3c173850f337661c9bf264d0406cf1
new file mode 100644
index 000000000..ac5229d86
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/65/d11c8b2d3c173850f337661c9bf264d0406cf1
@@ -0,0 +1,4 @@
+x
+0=).&MzcL[j>|R
+LTRs)6EVVs@fg[u'6==ha0duZwF
#lt kiY-hiϹX(ը
+Mr@%
\ No newline at end of file
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/71/2f414b554b56ba82d43e1f7a0fe33be7eecc95 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/71/2f414b554b56ba82d43e1f7a0fe33be7eecc95
new file mode 100644
index 000000000..4b6819c3a
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/71/2f414b554b56ba82d43e1f7a0fe33be7eecc95 differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/86/8a798775e91d6387f351add6c5abf06cdb3357 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/86/8a798775e91d6387f351add6c5abf06cdb3357
new file mode 100644
index 000000000..b1b016d21
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/86/8a798775e91d6387f351add6c5abf06cdb3357 differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/a5/272a200897df5558c8cad683c1af14f7184124 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/a5/272a200897df5558c8cad683c1af14f7184124
new file mode 100644
index 000000000..32ae211fe
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/a5/272a200897df5558c8cad683c1af14f7184124
@@ -0,0 +1,3 @@
+xj1]Sѯ1pU~i%g.g[.ҧfvGwC65S+{JIlbb[ 4ahFH)D
+Dx*2.9x
+(NsKqkGYA]41boħ3)y{OHW
\ No newline at end of file
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/b2/3d362d3fa47c3b1f29c4dd41c419326415122c b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/b2/3d362d3fa47c3b1f29c4dd41c419326415122c
new file mode 100644
index 000000000..eae6abec1
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/b2/3d362d3fa47c3b1f29c4dd41c419326415122c differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/dc/052e9e4df6fe8f66b7e110466e1db8ce104b8b b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/dc/052e9e4df6fe8f66b7e110466e1db8ce104b8b
new file mode 100644
index 000000000..e2e62f94a
Binary files /dev/null and b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/dc/052e9e4df6fe8f66b7e110466e1db8ce104b8b differ
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/objects/de/8f5ed6f8a58664edfbdecd20b75a6ea0633bf6 b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/de/8f5ed6f8a58664edfbdecd20b75a6ea0633bf6
new file mode 100644
index 000000000..9514173fe
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/objects/de/8f5ed6f8a58664edfbdecd20b75a6ea0633bf6
@@ -0,0 +1 @@
+xϱj1fv%L+ÞKe.gG{Ûao2eᒙ(dF5j@!$^mŤ EcٳAk!AANDƀ `cù/kl|q˧I衎~r(HѽCXf:O"_7w1qH
\ No newline at end of file
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/refs/heads/master b/test/integration_new/stash/rename/expected/repo/.git_keep/refs/heads/master
new file mode 100644
index 000000000..6d340468f
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/refs/heads/master
@@ -0,0 +1 @@
+209b9fa9264fa15f128127817f080fd7372050cf
diff --git a/test/integration_new/stash/rename/expected/repo/.git_keep/refs/stash b/test/integration_new/stash/rename/expected/repo/.git_keep/refs/stash
new file mode 100644
index 000000000..4d06169a5
--- /dev/null
+++ b/test/integration_new/stash/rename/expected/repo/.git_keep/refs/stash
@@ -0,0 +1 @@
+de8f5ed6f8a58664edfbdecd20b75a6ea0633bf6