受け入れられた答えは「ファイルについてGitを「忘れる」 ...」(歴史的に)ではありません。gitに現在/将来のファイルを無視させるだけです。
このメソッドはgitに無視されたファイル(過去 / present / future)を完全に忘れさせますが、リモートから再プルされた場合でも)作業ディレクトリから何も削除。
この方法では、の使用が必要です/.git/info/exclude
(推奨)をOR 既存 .gitignore
に全て忘れ/無視するファイルを持ってコミット。1
git ignoreの動作を実際に実行するすべての方法は、事実上履歴を効果的に書き換えるため、このプロセスの後にプルされる可能性のあるパブリック/共有/コラボレーションのリポジトリに大きな影響があります。2
一般的なアドバイス:クリーンなリポジトリから始めます-すべてコミットされ、作業ディレクトリまたはインデックスで保留中のものは何もありません。バックアップを作成しますください!
また、コメント/ 改訂履歴のこの答え(および改訂履歴のこの質問は)啓発/有用である可能性があります。
#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
最後に、以下のコマンドに関する重要な警告/情報を含むこのGitHubガイドの残り(手順6以降)に従ってください。
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
現在変更されているリモートリポジトリからプルする他の開発者は、バックアップを作成してから、次のことを行う必要があります。
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
脚注
1ので/.git/info/exclude
、おそらく取得の詳細については、上記の手順を使用して、すべての歴史のコミットに適用することができ.gitignore
、ファイルをにを必要とする履歴コミットには、この回答の範囲を超えています。.gitignore
それが私が最初にやったように、ルートコミットに適切な名前を付けたかったのです。コミット履歴の/.git/info/exclude
どこに.gitignore
存在しても同じことを達成できるため、他の人は気にしないかもしれません。また、影響を認識している場合でも、履歴を明確に書き換えることは非常に扱いにくいテーマです。。またです。
FWIW、潜在的な方法には、 git rebase
この質問への回答のように、外部コミットを各コミットにgit filter-branch
コピーするまたは .gitignore
2スタンドアロンgit rm --cached
コマンドの結果をコミットすることでgit ignore動作を強制的に実行すると、強制プッシュされたリモートからのプルで、新しく無視されたファイルが削除される可能性があります。--prune-empty
次のgit filter-branch
コマンドのフラグは、以前の「無視されたすべてのファイルを削除する」インデックスのみのコミットを自動的に削除することにより、この問題を回避します。git履歴を書き直すとコミットハッシュも変更され、、パブリック/共有/共同リポジトリからの将来のプルで大混乱が発生します。このようなリポジトリにこれを行う前に、影響を十分に理解してください。このGitHubガイドでは、次のことを指定しています。
共同編集者に 古い(汚染された)リポジトリの履歴から作成したブランチをマージするのではなく、リベース。1つのマージコミットで、パージの問題に行った汚染された履歴の一部またはすべてを再導入できます。
リモートリポジトリに影響を与えない代替ソリューションは、git update-index --assume-unchanged </path/file>
またはでありgit update-index --skip-worktree <file>
、その例はここにあります。
git clean -X
音は似ていますが、この状況には当てはまりません(ファイルがまだGitで追跡されている場合)。これは、間違ったルートをたどらないような解決策を探している人のために書いています。