web-dev-qa-db-ja.com

Gitでファイルを「コミット不可」としてマーク

自分の作品の一部をGitHubアカウントにアップロードして見せびらかしたい。ただし、データベース接続など、パスワードを含むファイルがいくつかあります。

GitHubに表示されないように、ファイルをGitでコミット不可としてマークする方法はありますか?

42
Adam Carter

GitHubに表示されないように、ファイルをGitでコミット不可としてマークする方法はありますか?

まず、ローカルのGitリポジトリで一部のファイルとコミットを表示する方法はありませんが、どういうわけかGitHubでは表示できません。 Gitでファイルをコミットした場合、GitHubに表示されます。

次に、個々のファイル自体を「コミットできない」ものとしてマークする簡単で実用的な方法はありません。ただし、Gitリポジトリ内のファイルを無視する方法は間違いなくあります。ファイル(必要に応じて相対パスを含む)を .gitignoreファイル

.gitignoreファイルは、Gitが無視する意図的に追跡されていないファイルを指定します。 Gitによってすでに追跡されているファイルは影響を受けません。詳細については、以下の注を参照してください。

基本的な.gitignoreはプレーンテキストファイルなので、簡単に作成できます。したがって、たとえば、ルートにconfig.phpファイルがある場合、これを実行します。 PHPを使用していると仮定しますが、コンセプトはすべてのセットアップに適用されます。また、この例ではテキストエディタとしてNanoを使用していますが、これに通常使用するテキストエディタを自由に使用してください:

nano .gitignore

そして、そのファイル名をそのファイルに追加するだけです:

config.php

保存すると、Gitはそのファイルを単に無視します。

とは言っても、このようなセットアップで私がやりたいのは、サンプル/サンプルの構成をリポジトリ内の機密性の高い特定のものから削除することです。そのため、構成ファイルの形式が次のような名前のファイルであるということについて、いくつかのリファレンスがあります。

config.SAMPLE.php

これにより、config.phpファイルがconfig.SAMPLE.phpを介してどのように設定されるかを正確に把握でき、実際のconfig.phpがGitに触れられないようにすることができます。

また、コードを自慢することを計画している場合は、誰かがそのコードを取得して独自のシステムに何らかの方法で実装しようとすることを期待する必要があります。覚えておいてください。私たちはあなたではなく、リポジトリにサンプルの構成ファイルがないと、人々は自分でコードを実装する方法を本当に理解しません。基本的には、基本的な構成例を提供しなかったために、自分が能力がないと考えているかもしれません。

68
JakeGould

コミット前フックを追加して、健全性チェックを実装することもできます。すべてのgitリポジトリの.git/hooksディレクトリには、いくつかのサンプルスクリプトがあります。

pre-commitというスクリプトは、各コミットの前に存在する場合に実行され、ゼロ以外の戻り値はコミットを中止します。

たとえば、次のような簡単なスクリプトを作成できます。

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

そして、そのfilenameが一致すると、コミットは失敗します。

28
Juho Östman

@JakeGouldの発言場合によっては、skip-worktreeassume-unchangedなどの特別なファイルビットを使用して、次のように設定することもできます。 2つの違いについては、 このスタックオーバーフローの回答を参照

git update-index --assume-unchanged <file>

これにより、既存のファイルへの追加の変更が非表示になり、プルするたびにファイルを残したい場合に使用できます。しかし、私はあなたが本当にあなたが何をしているのかを知っている場合にのみそれを使うことを勧めます。

11
phk

@JakeGouldが言ったように.gitignoreを使用します。さらに、いくつかの関連情報:

  • .gitignoreは、ファイルが追跡されないようにします。すでに追跡されている場合は、git rm --cachedを使用して削除します
  • $GIT_DIR/info/exclude内のファイル/パターンも無視されます
  • ユーザーの~/.gitconfigのc​​ore.excludesFileで指定されたファイル内のファイル/パターンも無視されます。

詳細は 公式Gitドキュメント を参照してください。

8
46and2

Jakeと46の回答を拡張するには、非常に良い方法の1つは、個人情報を含むファイルに一貫した拡張子を使用し、.gitignoreを使用して、その拡張子を持つファイルを常にグローバルに除外することです(他の場所で言及されている.gitconfigファイルを使用して、常に無視されます)。

そうすれば、たとえば次のようにすることができます。

/projectname/mypasswords.exc 

また、*.excをグローバルに除外した場合は、その特定のファイルを個別に除外するのを忘れても、コミットされないことがわかります。

2
Joe