0
0

More than 3 years have passed since last update.

空白と権限だけが変更されているファイル、新規追加されたファイルだけaddしたい

Posted at

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オプションでファイル名だけ出力されるようにし、xargsgit 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

これで、後はxargsgit addに渡せばOKです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0