gitはスペースとタブを自動的に切り替えることができますか?


196

私のpythonプログラムではインデントにタブを使用していますが、代わりにスペースを使用するユーザーと(gitを使用して)共同作業をしたいと考えています。

gitがプッシュ/フェッチ時にスペースとタブ(たとえば、4つのスペース= 1つのタブ)を自動的に変換する方法はありますか?(CR / LF変換と同様)


33
PEP8はまさに私の問題です。誰もがそれに従い、私は自分のタブに行き詰まっています。私はたまたま1つのインデント= 1つのタブが正しいことだと思います(なぜスペースなのか、なぜ4つのスペースなのか?PEP8はそれを説明しません...)。とにかく、このgitトリックを使用すると、コンピューターのタブを楽しく使用して、そこにいるすべてのPEP8フォロワーとコードを共有できます。
Olivier Verdier

7
ああ!TextMateを使用しており、スペース間をタブに変換できます。事は、私がタブを押したとき、私は私のエディターが書くことを好きです...タブです。したがって、スペースを含むpythonプロジェクトをチェックアウトすると、あらゆる種類のタブが挿入されます。手動でタブに変換する必要がありますが、チェックインすると、1000の削除、1000の追加のように見え、共同編集者は満足しません。:-)
Olivier Verdier

6
PEP8がタブの代わりにスペースを指定する理由は、継続インデント規則のためです。括弧内で長すぎる行を続けるには2つの方法があります。括弧の直後に新しい行を開始する場合は、インデントするだけです。かっこの内容の一部を最初の行に置く場合は、最初のかっこのインデントレベルで次の行にかっこを続ける必要があります。機能しないタブを使用する場合。
John Christopher Jones、

2
@JohnChristopherJonesそのような状況では、タブを使用してインデントを前の行と一致させ、次にスペースを使用して前の行の位置と一致させることができます。これは簡単にスペースに変換できます。残念ながら、インデント情報と位置合わせ情報が混在しているため、その逆は当てはまりません。
Patrick Parker

回答:


195

ここに完全なソリューションがあります:

リポジトリに、以下.git/info/attributesを含むファイルを追加します。

*.py  filter=tabspace

Linux / Unix

次にコマンドを実行します。

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

まず、brewでcoreutilsをインストールします。

brew install coreutils

次にコマンドを実行します。

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

すべてのシステム

これで、プロジェクトのすべてのファイルをチェックアウトできます。あなたはそれを行うことができます:

git checkout HEAD -- **

そして、すべてのpythonファイルはスペースではなくタブを持つようになります。

編集:強制チェックアウトコマンドを変更しました。もちろん、最初に作業をコミットする必要があります。


1
きれいなフィルターが機能しません。git addを実行すると、「エラー:外部フィルターの展開--tabs = 4 --initial failed」というエラーが表示されます。私はWindowsを使用しています。違いはありますか?
ジェレミーヒックス

2
@ジェレミー:展開/展開はUNIXコマンドです。Windowsポート/同等のものを見つけるか、Cygwinの
Tim

1
強力な

3
@Marc-André良い点です。私は実際にcoreutilsバージョンを使用しています。(インストールhomebrewしてから実行しますbrew install coreutils)。
Olivier Verdier

2
これはもう機能しないようです、フィルターは私には何もしません。チェックアウト後も、ファイルにはスペースが残っています。これに関する更新はありますか?
Philipp Ludwig

141

はい、可能な解決策の1つは、git属性フィルタードライバーGitProブックも参照)を使用して、汚れ/クリーンメカニズムを定義することです。

代替テキスト

そのように:

  • リポジトリのいくつかのファイルをチェックアウトするたびに、スペースをタブに変換できます。
  • ただし、チェックイン(およびプッシュとパブリッシュ)すると、それらの同じファイルはスペースのみを使用して保存されます。

このフィルタードライバー(ここでは ' tabspace' という名前)を.git/info/attributes(Gitリポジトリ内のすべてのファイルに適用されるフィルターの場合)に次の内容で宣言できます。

*.py  filter=tabspace

次にコマンドを実行します。

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

そのような汚れた/クリーンな一連の指示の具体的な実際の例については、Olivier回答を参照してください。


残念ながら、それは機能しません。私はすべての指示に従いましたが、gitはフィッターを適用しません。:-(チェックアウトするとスマッジフィルターが適用されず、チェックインしても何も起こりません... gitは時々とてもイライラします...
Olivier Verdier

@オリビエ:奇妙なことに、チェックアウト/チェックを遅くしないように、属性フィルターのスコープを(特定のタイプのファイルについてのみ、特定のサブツリーに)慎重に制限している限り、問題はありませんでした。進行中。たとえば、stackoverflow.com
questions / 62264 /…を

ありがとう!今では動作します。完全なソリューションを参照してください:stackoverflow.com/questions/2316677/…–
Olivier Verdier

@Vonc:おそらく--globalフラグを削除する必要があります。これは、すべてのコラボレーションプロジェクトにスペースを送信することを意味するためです...
Willem Van Onsem 2014年

@CommuSoftは、適切なプロジェクトにのみ適用され.gitattributesます。しかし、はい、構成がリポジトリのローカルに保持されている場合は理解しやすくなります。回答を編集しました。
VonC、2014年

39

GitHub(または他の同様のサービス)を使用しているすべての人にとって非常に役立つ情報

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

次に、2つのファイルがあります。 attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

そして attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

個人プロジェクトに取り組む

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

そうすれば、最終的にgithubに作業をプッシュしたときに8 space tabs、すべてのブラウザーでのデフォルトの動作であるコードビューで馬鹿げて見えることはありません。

他のプロジェクトへの貢献

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

これにより、2 space indentedプロジェクトの通常のタブを操作できます。

もちろん4 space to 2 space、私が発行したプロジェクトに貢献したい場合や、開発中に2つのスペースを使用する傾向がある場合は、変換用の同様のソリューションを作成できます。


2
関連:リポジトリの一部としてgit configを保存する ; また.gitattributes、リポジトリでファイルを使用(およびコミット)できることに注意してください
Tobias Kienzler

1

Windowsを使用している場合は、@ Olivier Verdierのソリューションを機能させるための追加の手順がいくつかあります。

  1. WindowsCoreUtilsをダウンロード
  2. インストール後、インストール場所をPATHに入れます(パス変数を追加する方法
  3. Windowsの拡張ユーティリティがすでに存在するため、expand.exeの名前をgexpand.exeに変更しました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.