web-dev-qa-db-ja.com

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

pythonプログラムでインデントにタブを使用しますが、代わりにスペースを使用する人々と(gitを使用して)コラボレーションしたいと思います。

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

191
Olivier Verdier

完全なソリューションは次のとおりです。

リポジトリにファイルを追加します.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ファイルには、スペースではなくタブが追加されます。

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

190
Olivier Verdier

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

alt text

その方法:

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

このフィルタードライバー(ここでは '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'

このような汚れ/クリーンな命令セットの具体的な動作例については、 Olivieranswer を参照してください。

133
VonC

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 [email protected]:some/repo.git
git pull Origin branch

そうすれば、2 space indentedプロジェクトの通常のタブで作業できます。

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

37
simo

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

  1. ダウンロード CoreUtils Windows用
  2. インストール後、PATHにインストール場所を入力します( パス変数の追加方法
  3. Windows expandユーティリティが既にあるため、expand.exeをgexpand.exeに名前変更しました。
0
odyth