##gitで困ったときに更新する記事
gitで分からなかったことを残しています。
##git管理の対象外にしたい 少なくとも3つの方法
自分のパスワードを記載した設定ファイル(database.yml
など)をGitHubなどにプッシュしたくなかった。
方法は少なくとも3つ。
###①.gitignore
や.git/info/exclude
に書き込む
これらのファイルに書き込むと、記載した特定のファイルがgit管理の対象外となる。
.gitignore
に書き込むと.gitignore
自身の差分ができるから、プッシュするとGitHubの.gitignore
も反映される。
.gitignore
の更新を反映したくなければ、後述するgit update-index --skip-worktree
を使用すれば反映されずに済む。
.git/info/exclude
はGitHubにプッシュされないので、対象外にしたファイルを知られたくないときや、余計な変更をプッシュしたくないときなどに使える。
なお、.git/info/exclude
は以下のように記載すれば反映される。
en.yml
ja.yml
test.txt
config/locales/en.yml
のようにパスを指定する必要はなく、そのままファイル名だけを書けばgit管理から除外される。
なお、.gitignore
と.git/info/exclude
は新規作成したファイルはgit管理から除外してくれるが、既にgit管理にあるファイルは、このファイルに書き込むだけではgit管理の対象外にならないと思われる。
実際にGitHubからgit clone
したdatabase.yml
はファイルに書き込むだけでは対象外にはならなかった。
差分を追跡されたくない特定のファイルがあれば(自分用にファイルを変更したいが、プッシュ時にはクローンされた当時の状態でプッシュしたいファイルがあるときなど。)、まずその追跡を解除する必要がある。
以下のコマンドを使った後、コミット・プッシュすれば、ファイルを削除せずにステージングを解除できるので、追跡を解除できる。
ただし、GitHubのリポジトリからは、当然.gitignore
などに記載してgit管理から除外したファイル自体が消える。
「自分が変更した内容が反映されていない状態」でファイルが残ることはない。
.gitignoreに記載したのに反映されない件
https://qiita.com/fuwamaki/items/3ed021163e50beab7154
$ git rm -f --cached .
$ git rm -f --cached ファイル名
上段は全てのファイルのインデックスを削除、下段は特定のファイルのインデックスを削除。
場合によっては-f
ではなく-rf
を付けないと削除できなかったり、--ignore-unmatch
を付けないと削除できなかったりする場合も。
--cached
をcached
にして実行すると、存在するファイルを削除することがあるので注意。
オプションの意味はきちんと理解して使う。
上段は全てのステージングを解除しているので、それらをステージングせずにGitHub等にプッシュすると、当然ステージングされなかったファイルはプッシュされない。
以下はgit rm -f --cached .
を実行してgit add .
でステージングせず、package.json
だけをステージングしてプッシュした状態。
当然GitHubにはpackage.json
しかない。
Gitのrmコマンドについて
https://git-scm.com/docs/git-rm
「Git の基本 - 変更内容のリポジトリへの記録」の後半にもcached
について触れている。
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2
###②git update-index --skip-worktree ファイル名
でファイルを更新しない
指定されたファイルは、変更してもgitでは更新されなくなる。
ただし、ステージングしているファイルが対象なので、新規作成してステージングしていないファイルには使えない。
使うためにはそのファイルがいるがステージングしている必要がある。
例)クローンした中にAファイルがあるとする。Aファイルに変更を加えたいが、プッシュするときリモートリポジトリにはその変更を反映させたくない。そんなときにこのコマンドを使えばいい。
実際のファイルを変更してもgitでは更新されなくなるので、ステージング候補としても上がってこない。git add
してもそのファイルはステージングされない。
git-update-indexについて
https://git-scm.com/docs/git-update-index
###③注意してaddせずにいる
ステージングをしなければ追跡されないので、GitHubにプッシュしても、そのステージングされていないファイル(差分)がGithub上には反映されることはない。しかし面倒。
この方法でするなら、git add .
で全ての変更をステージングした後、コミットする前にgit reset HEAD ファイル名
でステージングしたくないファイルだけを除外する方法もある。