Gitを使ってくれない / 使えない環境と協業する際に、修正した差分だけじゃなくドカッとファイルを渡されたは良いけど、OSも違って全部diffに上がってくるコトがあったので、何度もファイル参照するのが大変なのでメモ。
空白と権限だけが変更されているファイルだけをaddする
結論からすると、下記コマンドで対応しました。
$ git diff -w --ignore-blank-lines -G"." --name-only | xargs git add
空白だけが変更されているファイルを除く
まずは空白が変更されているファイルを除くコマンドは、通常のオプションで用意されています。
$ git diff -w
何故かこれでもほぼ全てのファイルがdiffに上がってくるので何故だろうと思っていたら、権限も変わっていたのが原因でした。
権限だけが変わっているファイルを除く
よくある情報はconfigを変更する下記のコマンドを実行すると権限のチェックはされないようになります。
$ git config core.filemode false
ただ、本当に権限を設定しておきたい場合もあるかもしれないのでもう少し調べてみた所、こんな情報が見つかりました。
When I’m looking at a git diff (or specifically a git diff --name-only where I’m looking for a list of files that have been changed), I often want to ignore mode changes (a.k.a. permission changes). By adding -G. to the command, mode changes will be ignored.
この記事によると-G.
を付けると権限だけ変わっている物を除外出来るようです。
$ git diff -G.
本来の-G
の用途は、正規表現でマッチした部分だけ表示する様にするオプションで、.
に指定することで、一文字でも変化があるファイルのみ一覧に出てくる様です。
後は、--name-only
オプションでファイル名だけ出力されるようにし、xargs
でgit add
に渡しました。
新規追加されたファイルだけaddする
結論からすると、下記コマンドで対応しました。
$ git ls-files --o --exclude-standard | xargs git add
インタラクティブモードで対応する
こちらも調べてみると良く出てくる情報は、下記のようなインタラクティブモードを使う方法でした。
# インタラクティブモードを起動
$ git add -i
# その後`a` > `*`と入力すると新規追加ファイルを全指定することが可能
参考 : git addで新規ファイルのみ追加する
ただ、自分はものぐさで物覚えが悪いので、インタラクティブモード内で入力する内容を忘れてしまうと思い、一発で対応できる方法を考えてみました。
新規ファイルだけの一覧を取得する
前例に併せてxargsで渡せればと思ったので、新規ファイルだけの一覧を取得する方法を調べてみました。
$ git ls-files --o --exclude-standard
参考 : git ls-files
これで、後はxargs
でgit add
に渡せばOKです。