コミットする前にgitが末尾の空白を自動的に削除するようにします


220

私はチームでgitを使用していて、差分、ログ、マージなどから空白の変更を削除したいと思います。これを行う最も簡単な方法は、gitが末尾の空白(およびその他の空白エラー)を自動的に削除することだと思います)適用されるすべてのコミットから。

以下を~/.gitconfigファイルごとに追加しようとしましたが、コミットしても何も起こりません。多分それは何か別のもののために設計されています。解決策は何ですか?

[core]
    whitespace = trailing-space,space-before-tab
[apply]
    whitespace = fix

私は、誰かがルビー特有のアイデアを持っている場合に備えて、ルビーを使用しています。コミット前の自動コードフォーマットは次のステップですが、それは難しい問題であり、実際には大きな問題を引き起こしていません。


core.whitespaceディレクティブで問題が解決しない場合は、pre-commitフック(.git / hooks / pre-commit)を変更して、問題を見つけて修正することもできます。詳細については、この投稿を参照してください。
VolkA 2009

2
私は同様の空白エラーと部分的な解決策に不満を感じており、バージョン管理システムを破壊するような空白エラーを修正または簡単に報告できる柔軟でかなり機能が完全なユーティリティを書いています: GithubのWhitespace Total Fixer(これが自己宣伝すぎる場合は謝罪)
Dan Lenski 2014

回答:


111

これらの設定(core.whitespaceおよびapply.whitespace)は、末尾の空白を削除するためのものではなく、次の目的で使用します。

  • core.whitespace:それらを検出し、エラーを発生させます
  • apply.whitespace:そして、それらを取り除きますが、「常に自動的に」ではなく、パッチ中にのみ

git hook pre-commitはそれのためにもっと良い仕事をすると信じています(末尾の空白を削除することを含む)


いつでもpre-commitフックを実行しないように選択できることに注意してください:

  • 一時的に: git commit --no-verify .
  • 永久に: cd .git/hooks/ ; chmod -x pre-commit

警告:デフォルトでは、pre-commitスクリプト(このスクリプトのような)には「末尾の削除」機能はありませんが、次のような「警告」機能があります。

if (/\s$/) {
    bad_line("trailing whitespace", $_);
}

ただし、特に次の点を考慮すると、より優れたpre-commitフックを作成できます。

ステージング領域にいくつかの変更のみを追加してGitでコミットしても、作業コピーとしては存在せず、機能しない可能性がある「アトミック」リビジョンになります。


たとえば、oldman別の回答で空白を検出して削除するpre-commitフックを提案しています。
そのフックは各ファイルのファイル名を取得するので、特定の種類のファイルには注意することをお勧めし.mdます。(マークダウン)ファイルの末尾の空白を削除したくない!


1
apply.whitespacegitをだまして作業コピーの変更をパッチとして処理させることで、gitがを介して作業コピーの空白を修正できると確信できます。以下の私の答えを参照しください。
ntc2 2013年

>「.md(マークダウン)ファイルの末尾の空白を削除したくない」-なぜですか?マークダウンファイルの末尾の空白の目的は何ですか?一部の.editorconfigファイルにはそのための特定のルールがあることに気づきました。
friederbluemle 2015

5
値下げのタイプに応じ@friederbluemle、末尾の二重のスペースを示している<br>github.com/FriendsOfPHP/PHP-CS-Fixer/issues/...
VonC

2.5.0でのコミット時core.whitespacetrailing-spacewithに設定してgit configもエラーは発生しませんgit
Karl Richter、

43

変更をパッチとして処理するようにGitをだまして、Gitにだまして空白を修正させることができます。「pre-commitフック」ソリューションとは対照的に、これらのソリューションは空白修正コマンドをGitに追加します。

はい、これらはハックです。


堅牢なソリューション

次のGitエイリアスはmy~/.gitconfigから取得され ます

「堅牢」とは、ツリーまたはインデックスがダーティかどうかに関係なく、これらのエイリアスがエラーなしで実行され、正しいことを実行することを意味します。ただし、インタラクティブgit rebase -iがすでに進行中の場合は機能しません。このコーナーケースについて気になる場合は、最後に説明したトリックが機能するはずの追加のチェックについて、my~/.gitconfigを参照しくださいgit add -e

Gitエイリアスを作成せずにシェルで直接実行したい場合は、二重引用符の間にすべてをコピーして貼り付けます(シェルがBashの場合を想定)。

ツリーではなくインデックスを修正する

次のfixwsGitエイリアスは、インデックス内のすべての空白エラーを修正しますが、ツリーには影響しません。

# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
#   the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git stash save FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git stash pop && \
    git reset --soft HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

インデックスに空白エラーがある場合、git fixws前に実行するのが目的git commitです。

インデックスとツリーを修正する

次のfixws-global-tree-and-indexGitエイリアスは、インデックスとツリーのすべての空白エラーを修正します(ある場合)。

# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~2 && \
    git reset HEAD~ && \
    git reset --soft HEAD~ ; \
  elif (! git diff-files --quiet .) ; then \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git reset HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

バージョン管理されていないファイルの空白も修正するには、次のようにします。

git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index

シンプルだが堅牢ではないソリューション

これらのバージョンはコピーと貼り付けが簡単ですが、サイド条件が満たされていない場合は正しく動作しません。

現在のディレクトリをルートとするサブツリーを修正します(ただし、空でない場合はインデックスをリセットします)

を使用git add -eして、アイデンティティエディタでパッチを「編集」します:

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

インデックスを修正して保持します(ただし、ツリーがダーティまたはインデックスが空の場合は失敗します)。

git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~

ツリーとインデックスを修正します(ただし、空でない場合はインデックスをリセットします)。

git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~

export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .トリックの説明

この答えgit rebase --whitespace=fixからトリックを学ぶ前に、私はどこでもより複雑なトリックを使っていました。git add

手動で行った場合:

  1. に設定apply.whitespacefixます(これを行うのは一度だけです):

    git config apply.whitespace fix
    

    これはGitにパッチの空白を修正するように伝えます

  2. 変更をパッチとして扱うようにGitを説得します。

    git add -up .
    

    ヒットa+ enter各ファイルのすべての変更を選択します。空白エラーを修正するGitに関する警告が表示されます。
    git -c color.ui=auto diffこの時点で、インデックス付けされていない変更が空白文字エラーであることがわかります)。

  3. 作業コピーから空白エラーを削除します。

    git checkout .
    
  4. 変更を元に戻します(変更をコミットする準備ができていない場合):

    git reset
    

GIT_EDITOR=:手段が使用する:エディタとして、コマンドとして :のアイデンティティです。


1
私はちょうどWindowsでそれをテスト:うまくDOSコマンドプロンプトで、この作品は:set VISUAL= && git add -ue . && git checkout .「注意.して使用する」git add:あるという理由git1.8.3の
VonC

@VonC VISUALの設定を永続的に解除しませんか。これにより、たとえば、の後でgit commit間違ったエディタが使用される可能性があります。VISUAL=これを回避するために、上のUNIXバージョンのサブシェルでパーツをラップしていますが、DOSにサブシェルがあるかどうかわかりません。
ntc2 2013

1
素晴らしいハックをありがとう!参考までに、core.editor設定した場合はVISUAL、の設定が優先されるため、エクスポートは効果がありませんman git-var。これを上書きするには、GIT_EDITOR=:代わりにエクスポートする必要があります。
Nick Felt

1
また、fixwsインタラクティブなリベースをすでに実行している場合は、バージョンがすぐに失敗するように微調整しました。そうしないと、git rebase --whitespace=fixラインで停止して変な状態になります。私はこの質問を借りて、ifの前に追加のケースを追加しました: fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Nick Felt


29

末尾の空白を削除するgit pre-commitフックを見つけました。

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
   # Fix them!
   sed -i 's/[[:space:]]*$//' "$FILE"
   git add "$FILE"
done
exit

3
2番目のsed呼び出し(sed -r 's/:[0-9]+:.*//')はで置き換えることができますcut -f1 -d:。これは、LinuxとBSDベースのプラットフォームの両方で同じように動作するはずです。
Ihor Kaharlichenko

2
@IhorKaharlichenko:実際にcutは、2番目の使用ほど安全ではありませんsed。「:」を含むファイル名の(ほとんどない)場合、カットは失敗します。awk 'NF>2{NF-=2}1'安全のために使用できます
MestreLion 2012年

1
ところで、Windows(msysgit)でを使用core.autocrlf=trueしている場合はdos2unix -D "$FILE"、sedの後にforループ内に追加することをお勧めします。それ以外の場合は、sedのみを発行して、すべてのCRLFをLFに変更します。
jakub.g

49
git addコミットフック内で行うことは、私にとってはかなり悪そうです。ファイルの部分的なステージング/コミットを実行している場合はどうなりますか?完全なファイルを背後でコミットしたくないのですか?
Stefaan

19

Mac OS(または、おそらくBSD)では、sedコマンドのパラメーターが少し異なる必要があります。これを試して:

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -E 's/:[0-9]+:.*//' | uniq` ; do
    # Fix them!
    sed -i '' -E 's/[[:space:]]*$//' "$FILE"
    git add "$FILE"
done

このファイルを次の名前で保存します。.git/hooks/pre-commitまたは、すでに存在するファイルを探して、その下のチャンクをファイルのどこかに貼り付けます。そして、chmod a+xそれを忘れないでください。

または、(Gitコミットフック-グローバル設定を介して)グローバルに使用する場合は、それを$GIT_PREFIX/git-core/templates/hooks(GIT_PREFIXが/ usrまたは/ usr / localまたは/ usr / shareまたは/ opt / local / shareの場合)にgit init入れて、既存のリポジトリ内で実行できます。

によるとgit help init

既存のリポジトリでgit initを実行しても安全です。すでに存在するものは上書きされません。git initを再実行する主な理由は、新しく追加されたテンプレートを取得するためです。


7
このフックは作業ファイルを変更して、変更された作業ファイルでインデックスを上書きしていませんか?'git add -p'を使用してインデックスを作成する場合、このcommitフックはそれを吹き飛ばしてしまいます。
Matthew Dutton

2
ええ、あなたはおそらく正しいです。誰かが使用するには、このスクリプトを書き換えする必要があります git hash-object -wし、git update-index直接インデックスにマングドファイルを挿入(再)へ。とても勇敢な人。
AlexChaffee

11

このタスクは、お気に入りのエディターに任せたいと思います。

保存時に末尾のスペースを削除するコマンドを設定するだけです。


2
vimではこれを行うことができます:autocmd BufWritePre .cpp、 .c、*。h:%/ \ s \ + $ // e
Robert Massaioli 2009年

3
テストする前に、上記のコメントに賛成票を投じました。パーセント記号の後に「s」がありません。空白が見つかった場合はカーソルが移動し、最後の検索パターンが削除されます。より良い代替案については、vim.wikia.com / wiki / Remove_unwanted_spacesをご覧ください。
セスジョンソン

1
emacsではMx delete-trailing-whitespaceです。
Mauvis Ledford、

2
さらに良いのは、emacsの場合(add-hook 'before-save-hook 'delete-trailing-whitespace).emacsファイルに追加して保存する前に末尾の空白を削除するフックを設定することです。Emacsホワイトスペーストリック
Duncan Parkes 2013年

1
タブをスペースに変換する(add-hook 'before-save-hook' whitespace-cleanup)も使用しています。
Nils Fagerburg 2013年

10

git属性の使用、およびgit configで設定されたフィルター

OK、これはこの問題を解決するための新しいタックです...私のアプローチは、フックを使用するのではなく、フィルターとgit属性を使用することです。これがあなたにできることは、あなたが開発している各マシンで、それらをコミットする前にファイルの最後にある余分な空白と余分な空白行を取り除く一連のフィルターをセットアップすることです。次に、フィルターを適用する必要があるファイルのタイプを示す.gitattributesファイルをセットアップします。フィルターには2つのフェーズがあり、cleanファイルをインデックスに追加するときに適用され、ファイルをsmudge作業ディレクトリに追加するときに適用されます。

グローバル属性ファイルを探すようにgitに指示します

まず、グローバル構成ファイルにグローバル属性ファイルを使用するように指示します。

git config --global core.attributesfile ~/.gitattributes_global

グローバルフィルターを作成する

次に、フィルターを作成します。

git config --global filter.fix-eol-eof.clean fixup-eol-eof %f
git config --global filter.fix-eol-eof.smudge cat
git config --global filter.fix-eol-eof.required true

sedスクリプトマジックを追加する

最後に、fixup-eol-eofスクリプトをパスのどこかに置き、実行可能にします。スクリプトはsedを使用して、その場で編集を行います(行末のスペースと空白、およびファイルの末尾にある余分な空白行を削除します)

fixup-eol-eofは次のようになります。

#!/bin/bash
sed -e 's/[  ]*$//' -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1

これの私の要点

新しく作成したフィルターを適用するファイルタイプをgitに指示します

最後に、お気に入りのエディターで〜/ .gitattributes_globalを作成または開き、次のような行を追加します。

pattern attr1 [attr2 [attr3 […]]]

したがって、空白の問題を修正したい場合は、すべてのcソースファイルに対して、次のような行を追加します。

*.c filter=fix-eol-eof

フィルターの考察

フィルターには2つのフェーズがあります。インデックスに追加またはチェックインするときに適用されるクリーンフェーズと、gitが作業ディレクトリにデータを配置するときのスマッジフェーズです。ここでcatは、ファイルの最後に改行文字がなかった場合に末尾の改行文字を追加する可能性があることを除いて、スマッジはそれらを変更しないままにするコマンドを介してコンテンツを実行しています。cleanコマンドは、http: //sed.sourceforge.net/sed1line.txtのメモからまとめた空白フィルタリングです。それはシェルスクリプトに入れる必要があるようです、私はsedコマンドを注入する方法を理解できませんでした。ファイルの最後にある余分な余分な行のサニテーションをgit-configファイルに直接含めます。(あなたCANちょうどセット、別々のsedスクリプトを必要とせずに、しかし、後続の空白を取り除くfilter.fix-eol-eofようなものにsed 's/[ \t]*$//' %fどこ\tタブを押すことにより、実際のタブです。)

require = trueを指定すると、問題が発生した場合にエラーが発生し、問題を回避できます。

gitに関する私の言葉が不正確な場合は、ご容赦ください。私は概念をかなりよく理解していると思いますが、まだ用語を学んでいます。


興味深いアプローチ。+1
VonC、2015

@VonC、ありがとう!また、この機会を利用して、git属性を.gitグローバルではなくフォルダーごとにリポジトリごとに構成できることを指摘したいと思います。
zbeekman 2015

9

以前の提案では、ターゲットファイルの末尾の空白が多すぎると、読み取り不可能なコミットが作成される傾向があるため、このpre-commitフックを記述しました。これにより、変更/追加した行から末尾の空白のみが削除されます。

#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

IFS='
'

files=$(git diff-index --check --cached $against -- | sed '/^[+-]/d' | perl -pe 's/:[0-9]+:.*//' | uniq)
for file in $files ; do
    diff=$(git diff --cached $file)
    if test "$(git config diff.noprefix)" = "true"; then
        prefix=0
    else
        prefix=1
    fi
    echo "$diff" | patch -R -p$prefix
    diff=$(echo "$diff" | perl -pe 's/[ \t]+$// if m{^\+}')
    out=$(echo "$diff" | patch -p$prefix -f -s -t -o -)
    if [ $? -eq 0 ]; then
        echo "$diff" | patch -p$prefix -f -t -s
    fi
    git add $file
done

1
面白い。+1。空の木を計算するための他の答えを見ください。
VonC 2013年

1
いい考えです、これがまさに私が望むものです。ただし、これを使用するときは注意してください。OSXとgitバージョン2.3.5を使用している場合、追加したがコミットされていない変更を吹き飛ばしました。私はまだこれのための実用的な解決策に興味があります。
Casper

9

コミット前のフックを試しください。末尾の空白を自動検出して削除できます。ありがとうございました!

それは下で働くことができGitBash(windows), Mac OS X and Linuxます!


スナップショット:

$ git commit -am "test"
auto remove trailing whitespace in foobar/main.m!
auto remove trailing whitespace in foobar/AppDelegate.m!
[master 80c11fe] test
1 file changed, 2 insertions(+), 2 deletions(-)

1
面白い。+1。私は自分の答え
VonC 2014年

@VonCあなたの肯定をありがとう!「.md」に、私は見つけただけでgit commit -no-verify、何か提案はありますか?
オールドマン2014年

.mdエンドユーザーにに--no-verifyオプションを追加するように依頼するのではなく、フックがファイルを検出し、空白を削除しないようにしたいと思いますgit commit
VonC 2014年

+or で始まるファイル/ディレクトリをコミットすると失敗します-
Rody Oldenhuis

6

これがubuntu + mac os x互換バージョンです:

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | (sed -r 's/:[0-9]+:.*//' > /dev/null 2>&1 || sed -E 's/:[0-9]+:.*//') | uniq` ; do
  # Fix them!
  (sed -i 's/[[:space:]]*$//' "$FILE" > /dev/null 2>&1 || sed -i '' -E 's/[[:space:]]*$//' "$FILE")
  git add "$FILE"
done

# Now we can commit
exit

楽しんで


あなたと私の違いは、ファイルを書き換える前にsedが実際に何かを置き換えるかどうかを確認することだけです... gitは実際には何も変更しない変更をコミットしないため、問題かどうかはわかりません。私はそれがわずかに安全だと思いますが、わずかに遅いと思います、そして私は1行で正規表現を2回繰り返さないという明快さを好みます。ド・グスティバス非論争EST!
AlexChaffee

違いは、バージョンが最初にubuntu構文を使用し、その後(失敗した場合)osx構文を使用することです。
sdepold

1
sdepoldの投稿を編集しました。ファイル名に空白を含めることもできるはずです。
imme

5

今日これについて考えていました。これが私がJavaプロジェクトのためにやったことのすべてです:

egrep -rl ' $' --include *.java *  | xargs sed -i 's/\s\+$//g'

3

以下のための崇高なテキストユーザー。

設定-ユーザー設定で以下を正しく設定してください。

"trim_trailing_white_space_on_save": true


1
これをファイルの種類で設定する方法はありますか?私が持っている*.md(マークダウン)「」に依存しているファイルの簡単なマーキング用(ダブルスペースを末尾)<br />、およびその設定を適用するように見えるすべて私がものを含めて、ファイル、いない末尾のスペースを削除します。
VonC 2014年

@VonC構成がどのように適用されるかについての階層があります。ここでは、stackoverflow.com / questions / 16983328 /… それが役に立てば幸い
Haris Krajina

2

ファイルのforループは$ IFSシェル変数を使用します。指定されたスクリプトでは、$ IFS変数にも含まれている文字が含まれているファイル名は、forループで2つの異なるファイルとして表示されます。このスクリプトはそれを修正します:与えられたsed-manualのmultiline-mode修飾子はデフォルトで私のubuntuボックスでは機能していないようですので、別の実装を探し、これを反復ラベルで見つけました、基本的にそれは置換のみを開始しますファイルの最後の行は、正しく理解していれば。

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

SAVEIFS="$IFS"
# only use new-line character as seperator, introduces EOL-bug?
IFS='
'
# Find files with trailing whitespace
for FILE in $(
    git diff-index --check --cached $against -- \
    | sed '/^[+-]/d' \
    | ( sed -r 's/:[0-9]+:.*//' || sed -E 's/:[0-9]+:.*//' ) \
    | uniq \
)
do
# replace whitespace-characters with nothing
# if first execution of sed-command fails, try second one( MacOSx-version)
    (
        sed -i ':a;N;$!ba;s/\n\+$//' "$FILE" > /dev/null 2>&1 \
        || \
        sed -i '' -E ':a;N;$!ba;s/\n\+$//' "$FILE" \
    ) \
    && \
# (re-)add files that have been altered to git commit-tree
#   when change was a [:space:]-character @EOL|EOF git-history becomes weird...
    git add "$FILE"
done
# restore $IFS
IFS="$SAVEIFS"

# exit script with the exit-code of git's check for whitespace-characters
exec git diff-index --check --cached $against --

[1] sed-subsitionパターン:sedを使用して改行(\ n)を置き換えるにはどうすればよいですか?


2

これはコミットの前に空白を自動的に削除するわけではありませんが、実行するのは簡単です。$ PATHのdirにあるgit-wsf(git whitespace fix)という名前のファイルに次のperlスクリプトを配置して、次のことができるようにします。

git wsf | sh

そして、gitがdiffとして報告するファイルの行からのみ、すべての空白を削除します。

#! /bin/sh
git diff --check | perl -x $0
exit

#! /usr/bin/perl

use strict;

my %stuff;
while (<>) {
    if (/trailing whitespace./) {
        my ($file,$line) = split(/:/);
        push @{$stuff{$file}},$line;
    }
}

while (my ($file, $line) = each %stuff) {
    printf "ex %s <<EOT\n", $file;
    for (@$line) {
        printf '%ds/ *$//'."\n", $_;
    }
    print "wq\nEOT\n";
}

0

少し遅れますが、これは誰かを助けるかもしれないので、ここに行きます。

VIMでファイルを開きます。タブを空白で置き換えるには、vimコマンドラインで次のように入力します

:%s#\t#    #gc

他の末尾の空白を取り除くには

:%s#\s##gc

これでかなりうまくいきました。編集するファイルがたくさんあると、退屈です。しかし、プリコミットフックや複数のエディターでの作業よりも簡単だと思いました。


それが面倒になった場合、そして編集しようとしているもののバックアップがある場合は、sedを使用してタブをスペースに変更するだけですsed -i 's|\t| |g' filenames(置換位置のスペース)。findを使用してファイル名を取得できることに注意してください。バックアップを取得する方法を考えていない場合は、通常、すべてをコミットしてから、コミットを「元に戻し」、現在の場所にソフトリセットします。時々私はすべてをツリーに追加しますがコミットしません、そして時々私はスタッシュ/適用を使用します(ポップではありません!)。気になる場合は、干渉する前にツリー全体を安全な場所に再同期します...
セージ

0

ファイルの行末の末尾の空白を可搬的に削除するには、次を使用しますed

test -s file &&
   printf '%s\n' H ',g/[[:space:]]*$/s///' 'wq' | ed -s file

-1

これはおそらくあなたの問題を直接解決しないでしょうが、実際のプロジェクト空間でgit-configを介してそれらを設定したいかもしれません。それは〜/ .gitconfigではなく./.git/configを編集します。すべてのプロジェクトメンバー間で設定を一致させておくと便利です。

git config core.whitespace "trailing-space,space-before-tab"
git config apply.whitespace "trailing-space,space-before-tab"

3
私の知る限りで、.git内部の設定がされていない他の誰と共有します。彼らあなたの地元のレポにしている特定
AlexChaffee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.