👌

git add とgit ls-filesのignoreとotherオプションについて理解する

2021/05/11に公開約3,400字1件のコメント

git ls-filesについて勉強する機会があったのでまとめます。

git ls-filesとは

ls-filesコマンドとはstagedにインデックスされているファイルを表示するコマンドである

何のことやらと思うかもしれないが、要はgit addした後のファイルたちのことである。

そもそもgit addとは

git addはコミットする前にする作業であるが、
実際に何をやっているかというと、gitが管理できる場所に対象のファイルをおいている
ファイルを作成するとgitは*untracked(直訳で追跡不可)*という状態でそのファイルを確認する。
実際にtouchでtestというファイルを作成した後に、git statusをしたのが以下

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

test

nothing added to commit but untracked files present (use "git add" to track)
c1r2s2% 

Untracked filesの中に、testというファイルが入っているのがわかる。
これをgit addしてあげることで、gitが管理できる場所つまりステージングエリアに移動する事ができる。
これを専門用語でstagedにインデックスすると言ったりもする。
ステージ(gitが見ている舞台)に上げるという認識をするとわかりやすいかも。

$ git add test
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

new file:   test

これでChanges to be committedとなり testファイルがコミットされる予定のファイルとなった。
コミットされる予定のファイル=gitの監視対象になるファイルということ。
ちなみにgit statusの出力にも記載されているが、git reset HEAD testと入力するとtestファイルはunstageとなり、また元々のuntrackedの状態に戻る。

git ls-files

git addがわかったところで話をもとに戻すと、git ls-filesはステージングエリアに存在するファイルを閲覧するという意味。

ちなみにlsはlist directory contentsの略でディレクトリに存在するコンテンツをリスト化するという意味。
なので、git ls-filesgitの監視対象にある、ディレクトリに存在するファイルのみをリスト化するということ。ディレクトリは閲覧できないので注意。

またgit ls-files既にコミット/プッシュしたファイルも表示される。コミットしたファイルなども既にステージングエリアに存在しているので、表示される。

git ls-files --other

--otherは-oでも実行可能です
ここからオプションの話。
otherはgit ls-filesで表示されるもの以外を表示するコマンド。
要するにuntrackedなファイルを表示する。
なので、もし先程の例のtestファイルを表示させたい場合は、git reset HEAD testをしてuntracked状態にしてから、git ls-files --otherを入力することで表示が可能。
他にも.gitignoreに記載されているようなuntrackedなファイルも、このコマンドで表示することが可能

git ls-files --ignore <オプション>

--ignoreは-iでも実行可能です
ignoreオプションはステージングエリアに存在する無視されるファイルのみを表示するコマンド。
いくつかのオプションから対象の無視されるファイルを指定できる。
選択肢はここにある。

https://git-scm.com/docs/git-ls-files#Documentation/git-ls-files.txt--xltpatterngt

ここでは--exclude-standardを見てみる。
公式を見ると以下のようにある。

Add the standard Git exclusions: .git/info/exclude, .gitignore in each directory, and the user’s global exclusion file.
つまり、.git/info/excludeに記載されているファイル形式 or それぞれのディレクトリに存在する、.gitignoreに記載されているファイル or ユーザーが除外対象にしているファイルとなる。

.git/info/excludeの中身はデフォルトでは何も書かれていない。

$ cat .git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

なにか除外したいファイルなどがあれば追記する方式

.gitignoreに記載されているファイルに関しては、それぞれの.gitignoreを参照して記載してあるファイルたちが対象になる。

ユーザーが除外対象にしているファイルは独自に除外設定しているファイルなどで通常であれば、気にする必要はない。

つまり、git ls-files --ignored --exclude-standardは上記3つのファイルについて表示するということである。

なので、個人の設定などをなにもしていなければ、ignoreオプションで参照できるファイルは
gitignoreに記載されてあるファイルのみとなる

注意点

ただ.gitignoreに記載されているファイルはaddができない。そういう仕組みだからだ。
理由は.gitignoreの仕組みを参照していただけると。

https://qiita.com/anqooqie/items/110957797b3d5280c44f

なので、ignoreオプションを使うときは、--otherとセットになる。

まとめると、.gitignoreに記載されてあるファイルを出力するコマンドは以下
git ls-files -io --exclude-standard

ちなみに

ignoreオプションを単体で使う方法もある。
それはaddしてstagedされた状態のファイルを.gitignoreに後から追加する方法である。
こうすればgit ls-files -i --exclude-standardで参照できる。

ちなみにgitignoreにはpushされたくないファイルを追加するはずだが、この場合だと.gitignoreに記載されていても、commit/pushが可能なので注意が必要。
一度対象ファイルをunstagedすればaddできなくなる。

Discussion

ログインするとコメントできます