3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

git備忘録

Posted at

##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は以下のように記載すれば反映される。

(railsアプリ名)/.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を付けないと削除できなかったりする場合も。
--cachedcachedにして実行すると、存在するファイルを削除することがあるので注意。
オプションの意味はきちんと理解して使う。

上段は全てのステージングを解除しているので、それらをステージングせずにGitHub等にプッシュすると、当然ステージングされなかったファイルはプッシュされない。

以下はgit rm -f --cached .を実行してgit add .でステージングせず、package.jsonだけをステージングしてプッシュした状態。
当然GitHubにはpackage.jsonしかない。

github.png

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 ファイル名でステージングしたくないファイルだけを除外する方法もある。

3
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?