我正在開發一個預先提交的鉤子來重新格式化代碼,並且通常它可以工作;它會重新格式化任何分階段文件,並且結果提交包含所需的重新格式化代碼。瞭解git commit - 只有和預先提交的鉤子
但是,它不能很好地與git commit --only
(這是JetBrains IDE使用的變體)很好地玩,我試圖理解爲什麼。 /的git commit --only
和組合pre-commit鉤子導致不希望的索引工作樹狀態,如在下面的事件序列描述:
如果我使用格式錯誤的變化小到一個文件中,然後運行git status
,這是我所看到的:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file.php
no changes added to commit (use "git add" and/or "git commit -a")
如果我然後提交使用git commit --only -- file.php
,預提交鉤子運行,並改變和重新格式化file.php
承諾。
但是,如果我然後再次運行git status
,這是結果(箭頭標註礦):
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: file.php <-- contains original change, improperly formatted
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file.php <-- contains original change, properly formatted (per the most recent commit)
哪裏上演新變化和來自的工作樹的變化?
有人能夠準確解釋git commit --only
如何與索引交互以產生上面顯示的結果 - 甚至更好,是否有辦法讓我的pre-commit鉤子與它很好地搭配?
我的理解是,git commit --only
與工作樹中的文件版本一起工作,所以我嘗試從預提交鉤子中刪除git add
步驟以查看將會發生什麼,並導致格式不正確的版本該文件被提交,並在工作樹中正確格式化(這符合我對標準git commit
的期望,但我不確定在git commit --only
的上下文中會發生什麼)。
我知道使用clean
過濾器重新格式化代碼的可能性,而不是預先提交的鉤子,但這種方法引入了一些情景複雜情況,如果可能的話很好避免。
說明:此問題與Phpstorm and pre commit hooks that modify files有關,但重點在於解決git commit --only
上下文中的問題。此外,JetBrains似乎也沒有解決這個問題,正如在該問題的公認答案中所表明的那樣。
關於更多關於預提交對git commit行爲的影響:https://stackoverflow.com/a/7230886/6309 – VonC