2013-10-03 29 views
12

我知道使用預先提交鉤子可以刪除尾部空白。我有興趣做手動。我讀到這裏的問題是:
Make git automatically remove trailing whitespace before committing - Stack Overflow
答案最接近我想要的是the "automatic version" from ntc2

git在提交之前刪除新文件中的尾部空白

(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset 


該命令效果很好,除了它似乎只對那些已經文件的更改在回購中,不是新文件。我有一堆新的文件,這意味着他們還沒有進入回購。我想從這些文件中刪除空格,所以我嘗試添加-A而不是-u,但這沒有什麼區別。

+1

你的意思是「'git add -Ae'根本不添加新文件」?或者:「文件已添加,但未修復」? – VonC

+0

@VonC它不適用於未追蹤或新增的文件(第一次添加但尚未提交)。對我來說它顯示'致命的:空補丁。 Aborted.'我正在使用git版本1.8.3.msysgit.0。 – loop

+0

@test:如果您對我的原始答案留下了評論,或者詢問如何讓我的命令起作用,或者鏈接到您的問題,我會收到通知,並可能告訴您有關「添加-N」的信息。但是,所以我很聰明地把你的問題放在「相關」部分,所以我今天編輯我的答案時看到了它。 – ntc2

回答

30

手動從去年3個提交清理空白,你可以這樣做:

git rebase --whitespace=fix HEAD~3

當我在一個主題分支工作,I(通常由這樣創建的話)

git checkout -b topic -t

跟蹤上游分支

它允許我從git rebase中刪除最後一個參數。所以一旦我做&準備合併,我可以快速清洗整個主題分支:

git ws#化名變基--whitespace =修復

需要注意的是,不同的是HEAD〜3例,這如果發生變化,實際上會改變上游分支的變更! (但是,這也是我想要的東西,在我的工作流程。)

+0

盧克工程,但你知道爲什麼我不能在我的問題中使用我問過的命令? – loop

+0

打我,恐怕;但考慮到whitespace = fix是爲了應用補丁(包括rebase),所以不會讓我感到驚訝。從未跟蹤的文件剝離ws類似於編輯回購之外的文件:這不是git的工作。 –

+2

嘿,這裏是我剛炮製出來的東西(從基本命令)來刷新階段性變化(之後保留添加文件的選擇):'git commit -mTemp && git stash && git rebase HEAD〜--whitespace = fix && git reset --soft HEAD〜&& git stash pop'。 –

2

簡單的解決

你報

(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset 

作品的命令,如果你先加你想與git add -N <files you want to fix>修復文件。 add -N基本上告訴Git假裝你以前提交過這些文件的空白版本。

錯誤你有

我不明白爲什麼你fatal: Empty patch. Aborted.誤差add -Ae,但它看起來像一個錯誤,因爲這樣做純git add -A . && git diff --cached表明,該補丁不應該實際上是空的。

更好空白定影液

我最近更新 my answer that you linked to 有更好的Git別名固定空白。下面是別名的重寫 使用 Luke's rebase trick和 少冗餘控制流程:

fixws =!"\ 
    if (! git diff-index --quiet --cached HEAD); then \ 
    \ 
    git diff-files --quiet `git rev-parse --show-toplevel` ; \ 
    export NEED_TO_STASH=$? ; \ 
    \ 
    git commit -m FIXWS_SAVE_INDEX && \ 
    if [ 1 = $NEED_TO_STASH ] ; then git stash save FIXWS_SAVE_TREE; fi && \ 
    git rebase --whitespace=fix HEAD~ && \ 
    git reset --soft HEAD~ && \ 
    if [ 1 = $NEED_TO_STASH ] ; then git stash pop; fi ; \ 
    fi" 

這修復了指數的空白,同時保留指數,以及 離開樹不變。有了這個別名,你可以修復回購未版本控制 文件與

git add --all :/ && git fixws && git reset 

但是,它也能處理在 固定了空白提交你工作的更常見的情況。這是複雜的,因爲它的工作原理,即使 指數或樹是乾淨的。

+0

如果這樣做不會影響到樹,這並不意味着索引中的任何空白修復將顯示在'git diff'中反向運行,並且在將受影響的文件添加到索引時將被還原?我想這就是爲什麼你在你的管道中有'git reset'的原因,但是這似乎取消了保持樹不變的好處。 – jbyler

+0

@jbyler:如果你指的是'add','fixws','reset'組合中的'reset',那麼這個點就是撤銷初始'add'。請注意,默認重置爲「 - mix」,它只觸及索引,而不是樹。 – ntc2

+0

嗨,我今天添加了你的別名,並嘗試了更好的空白修補程序命令行。它最初並不起作用,因爲我之前啓用了預提交鉤以捕獲空白違規。我懷疑發生了什麼,所以我禁用了它,然後運行你的命令,它就起作用了。再次感謝! – loop

6

我喜歡盧克的回答,除非你需要手動指定基提交,或使用重訂式的工作流程,當你的歷史是線性的限制。我建議並不需要一個額外的參數並不會改變你的提交圖的拓撲結構的修改。作爲一個shell命令:

git rebase --whitespace=fix --onto $(git merge-base HEAD @{u}) 

或者作爲〜/別名的.gitconfig:

ws = "!git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})" 

我喜歡這一點,因爲有時候我想變基我的變化,但如果我認爲覺得可能是合併衝突我寧願合併,這樣既我原來的變化和衝突解決將被記錄在歷史上。這樣我可以稍後猜測衝突解決方案並在必要時重做。

既然我並不總是變基,我寧願不要混用空格固定與基礎重建;因此對盧克的答案進行了修改。

此外,啓用默認的預先承諾掛鉤,中止對空白錯誤:

cp .git/hooks/pre-commit.sample .git/hooks/pre-commit 

這給出了以下工作流程,這是我喜歡的,因爲它是足夠的手冊,我知道這是怎麼回事,但自動化足夠不要礙事:

  1. 砍砍砍,引進空白錯誤
  2. 企圖犯
  3. 提交失敗以w hitespace誤差由於pre-commit鉤子
  4. git commit --no-verify犯反正
  5. git ws使用別名來解決

注意對--onto用法:這是沒有必要在這裏,但我覺得它更容易推理這個rebase如何以這種方式工作。在盧克的版本,HEAD~3是在手冊頁<upstream>,而在我的版本<upstream>保持分支的真正上游的默認值。不管怎樣,你最終都會得到相同的結果。

+0

那裏有'--onto'的好用法。 +1 – VonC