git add とgit ls-filesのignoreとotherオプションについて理解する
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-files
はgitの監視対象にある、ディレクトリに存在するファイルのみをリスト化するということ。ディレクトリは閲覧できないので注意。
また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オプションはステージングエリアに存在する無視されるファイルのみを表示するコマンド。
いくつかのオプションから対象の無視されるファイルを指定できる。
選択肢はここにある。
ここでは--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の仕組みを参照していただけると。
なので、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
些細なことなのですが、
--other
ではなく--others
ではないでしょうか。--other
でも動くようですが。