我有一個預提交鉤子,它在整個代碼庫上運行一個腳本,就好像提交已完成一樣。為了做到這一點,我首先git stash -k -u要隱藏我的未暫存更改和未跟蹤檔案。然后我運行檢查(此時只包含已提交和暫存的代碼)。之后,我想將 repo 恢復到之前的狀態。這意味著暫存的更改保留,作業樹恢復原樣,包括未跟蹤的檔案和未暫存的更改。
我不確定如何做最后一部分。首先我嘗試過git stash pop,但是當具有暫存更改的檔案也有未暫存更改時,這會失敗。接下來我嘗試了git restore -s stash .哪個修復了以前的問題,但沒有恢復未跟蹤的更改。就好像.命令中的in 指的是作業樹的布局而不是源樹的布局。這是一個錯誤嗎?有沒有其他方法可以完成我所描述的內容?我沒主意了。
uj5u.com熱心網友回復:
強調文本我有一個預提交鉤子,它在整個代碼庫上運行一個腳本,就好像提交[已經]完成一樣。為了做到這一點,我首先
git stash -k -u要隱藏我的未暫存更改和未跟蹤檔案。然后我運行檢查(此時只包含已提交和暫存的代碼)。之后,我想將 repo 恢復到之前的狀態。
推薦的方法是:
git reset --hard
git stash pop --index
pop此處的步驟應始終成功,前提是該git stash push步驟首先執行了任何操作。最后一個“provided”意味著有一個重要的條件:你應該檢查是否git stash -k -u真的做了一個 stash,因為在某些情況下,它什么都不做。在這種情況下,這git reset --hard是不必要的(但只要您的測驗沒有修改任何內容就安全),并且git stash pop 不得運行,因為這會彈出其他一些存盤。
(你怎么知道是否git stash push真的創建了一個 stash?我推薦一個兩步git rev-parse序列,它可以回傳到舊版本git stash的push動詞甚至不存在的地方——你必須使用它git stash save——你做的地方:
old=$(git rev-parse -q --verify refs/stash || true)
git stash push -k -u
new=$(git rev-parse -q --verify refs/stash || true)
您現在可以測驗是否$current與$new匹配為字串:
test "$old" != "$new" && do_unstash=true || do_unstash=false
例如。現在,您可以使用以下條件來調節最終git stash pop序列:
if $do_unstash; then git reset --hard && git stash pop --index; fi
如果該push步驟進行了存盤,則兩個git rev-parse命令的輸出不同:要么$old為空且$new為非空且為存盤的哈希 ID,要么$old為非空且$new為非空且它們不同且$new再次為哈希存盤的 ID。但是,如果git stash push決定做什么,那么要么$old是空的,并 $new為空,或者 $old包含舊頂級的藏匿堆疊哈希ID和$new包含相同的哈希ID。
但是,如果您有足夠的空間,我建議git checkout-index在空臨時目錄中的“干凈”運行上運行測驗,之后您可以洗掉空的臨時目錄。這不需要任何花哨的git stash作業,因此即使git stash被破壞也能正常運行(就像最近的幾個 Git 版本一樣,顯然基于 StackOverflow 上的問題,有時git stash pop無法恢復未跟蹤的檔案)。這也巧妙地避開了所有奇怪的極端情況,例如從未實際添加的意圖添加索引條目。
uj5u.com熱心網友回復:
不確定這是一個很好的答案,但是有git stash show --only-untracked-v(不知道為什么--only-untracked開關甚至存在),它只輸出存盤中未跟蹤檔案的差異。這個差異可以通過管道輸入git apply - 來重新創建檔案。
總共...
git stash show --only-untracked -v | git apply -
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391816.html
標籤:混帐
