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


41

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

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


1
タンジェンシャル提案:いくつかは非常にコンフィギュレーションファイルに結婚しているので、これは、すべてのプラットフォーム上で適用できないことがありますが、あなたは環境の中で、これらのパラメータを維持する12factorアプローチ以下検討することもでき:12factor.net/configを。つまり、アプリケーションコードが構成ファイルの存在を想定しないようにします。(これらを設定するプライベートスタートアップスクリプトとは対照的に、ローカルマシンから離れることはありません。)
millimoose

1
誤ってコミットした場合は、完全にgit履歴から削除してください(他の質問でその方法を説明します)。削除して無視しても、コミットされた古いバージョンは履歴に残り、Githubに表示されます。
curiousdannii

3
すべての答えがあなたの質問に実際に答えているわけではないことに注意してください。彼らはファイルをコミット不能にせず、デフォルトでそれを無視するようにgitを設定するだけです。しかし、あなたが誤ってあなたはgitのコマンドラインにそのファイル名を挿入することができ、それはのパターンにマッチしたにもかかわらず、それをコミット終わります.gitignore。私の知る限りgit、すべての場合に特定のファイルをコミットしないように指示する100%完全な証明方法はありません。これは機能とみなされるかもしれません...
バクリウ

ハードコードされたパスワードを削除して、より安全な代替手段に切り替えることができます。その後、データベースのパスワードを切り替えることができます。古いパスワードはまだコミット内にありますが、あなたよりも誰かが読めるようになると古いパスワードになります。コミットが既にビルドされていると、コミットを変更できないことを確信しています。
BlueWizard

3
@curiousdanniiの発言に加えて、GitHubには、誤ってコミットした機密データを削除する方法を説明するページ全体があります。とりわけ、このページでは、誤って公開したパスワードとキー変更するように指示されています。help.github.com/articles/remove-sensitive-data
ケビン-モニカの復職

回答:


67

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が実際のファイルに触れないようにすることができます。

また、コードを披露する予定がある場合は、誰かがそのコードを取得して何らかの方法で自分のシステムに実装しようとすることを期待する必要があります。私たちはあなたではなく、あなたのリポジトリにサンプル設定ファイルがなければ、人々は自分でコードを実装する方法を本当に理解しないでしょう。基本的な設定例を提供しなかったので、彼らはあなたが有能ではないと思うかもしれません。


11
正しい答えサンプルの構成ファイル提案するために+1 。Ruby向けのフィガロのようなライブラリは、この方向にあなたを微調整します。実際の値に似た値でコミットされたサンプルファイルを用意して、コードを見る人が環境がどのように見えるかを知っておく必要があります。Herokuなどの一部のプラットフォームは環境変数を使用するため、のような構成を設定しdatabase_url = Environment.DATABASE_URL、上記のようなコメントを残すことができます# postgres://username:password@localhost/dbname
クリスサイレフィス

@ChrisCireficeありがとう!いつも私を驚かせる新しい「ツール」が出回っているのは明らかです。このコードが他の人間によって読まれようとしている場合、構成がどのように機能するかを説明せずに正確に何をするのでしょうか?再度、感謝します。
-JakeGould

27

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

呼び出されるスクリプト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一致する場合、コミットは失敗します。


1
+1これは、ファイルの明示的な追加とコミットを実際に防ぐ正しい答えです。
R ..

確かに、推奨される方法は、この予防策を講じることに依存しないことです(つまり、代わりに `.gitignoreを使用します)。
デビッドZ

2
@R ..はい、いいえ。質問は「ファイルをコミット不能としてマークする」と述べていますが、その精神は「ファイルがコミット.gitignoreされないようにすること」 です。ただし、Gitのほとんどのユーザーは事前コミットスクリプトを実際に使用していません。セットアップに関するある程度の知識が必要であり、単に.gitignoreファイルを使用するよりもこのような方法が望ましい理由がいくつかあります。しかし、これはいくつかのより複雑な場合に非常に役立ちますが、使用する必要があることが本当にわかっている場合に使用するコンセプトです。
JakeGould

2
.gitignoreを100%信頼できない状況でこれを使用していることがわかります(誤って何かを実行すると、gitがファイルを追加してコミットするよう要求することがあります)。または、他の誰かが.gitignoreファイルを編集する可能性があります(結局、バージョン管理下にあります)。テスト可能なプロセスが本当に必要な場合、これはそのようなプロセスに取り組むことができるものです。
コートアンモン

@CortAmmonそれは常に信頼に関するものではありません。コミットしたくない一時的および非公開のデバッグ情報をソースコードに追加できますが、そのようなファイルは無視できません。代わりに、違法なものが含まれていない場合、コミットする前にチェックする必要があります。これは、このユースケースに適したソリューションのようです。実際、これは私のユースケースであるため、これがこの質問の見つけ方です。
t3chb0t

12

@JakeGouldが言ったこと。いくつかの例では、あなたはまた、のような特殊なファイルのビットの使用作ることができるskip-worktreeか、assume-unchanged次のように設定することができます。2つの違いについては、このStack Overflowの回答を参照してください

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

これにより、既存のファイルへの追加の変更が非表示になり、すべてのプルの後にファイルが本当に必要な場合に使用できます。しかし、自分が何をしているかを本当に知っている場合にのみ使用することをお勧めします。


8

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

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

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


2

Jakeと46の答えを拡張するには、プライベート情報を含むファイルに一貫した拡張子を使用し.gitignore、その拡張子を持つファイルを常にグローバルに除外することをお勧めします(.gitconfig他の場所で述べたようにファイルを使用して、常に無視します)ユーザー向け)。

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

/projectname/mypasswords.exc 

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.