web-dev-qa-db-ja.com

git-lfsを無効にする方法は?

LFSを使用しているbitbucketにリポジトリがあります。しばらく使用してから、リポジトリを自分の管理下のスペースに戻すことにしました。そもそもLFSを使用した唯一の理由は、リポジトリのサイズ制限を事実上2倍にすることでした(LFS内のファイルが別のバケットに移動するため)。

Git履歴全体をトロールし、git LFSが行う作業のすべてのトレースを削除する方法が必要です(したがって、すべてのファイルが「正常に」コミットされます)。これが完了したら、新しいリポジトリにプッシュを強制するつもりです。

私はかなりの検索を行っており、 推奨される解決策 に遭遇しましたが、それらは高レベルであるため、それらを実装/実行する方法がわかりません。

Git LFSに別れを告げるにはどうすればよいですか?

10
Shadow

現在のコミットのみを更新

LFSから移動したいが、git履歴全体の修正についてそれほど心配していない場合は、以下を実行できます。

git lfs uninstall
touch **/*
git commit -a

これにより、LFSサポートがアンインストールされ、すべてのファイルに触れて(gitが変更を認識できるように)、すべてのファイルをコミットします。必要に応じて、より具体的にすることができます(つまり、**/*.png 例えば)。 **には拡張globサポートを有効にする必要があります(shopt -s globstar on bash)

履歴全体を更新

これは私にとってはうまくいきましたが、多くのエラーがスローされ(I thinkファイルがLFSに追加されていないコミットごとにエラーが発生します)、時間がかかります(約2コミットごとに-3秒)。

git lfs uninstall
git filter-branch -f --Prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | git add
' --tag-name-filter cat -- --all

Git LFSサポートをアンインストールし(理論的にはLFSがインデックスに干渉しないようにします)、コミットごとにLFSファイルが適切にチェックアウトされていることを確認してから、すべてに触れ(gitが変更を認識している)、LFSの設定を削除します.gitattributesこれにより、クローン作成時にLFSを使用しようとしないで、実際のファイルをインデックスに追加します。

上記を実行した後、強制プッシュを実行する必要があります。当然、それはあなたのリポジトリで作業している他の人を切り離されたヘッド状態に投げます-コードフリーズ中にこれを行うのが賢明です。その後、全員に新しいクローンを作成させるのがおそらく最も簡単です。

13
Shadow

git lfs migrate export

git lfs migrate helpから:

書き出す

exportモードは、Git履歴に存在するGit LFSポインターファイルをGit LFSから移行し、対応するオブジェクトファイルに変換します。

ワークフローの例

  1. 実際にgit lfs ls-filesのLFSファイルがあることを確認してください。
  2. リポジトリ内のすべてのfilter=lfsファイルからすべての.gitattributes行を削除します。 .gitattributesはどこにでも存在する可能性があるため、それらをすべて見つけてください。そうしないと、後で移行の問題が発生する可能性があります。
  3. .gitattributesに加えた変更をコミットします。
  4. git statusで変更がないことを確認してください。
  5. 移行を実行します:git lfs migrate export --everything --include .
  6. git statusを実行して、変更がないことを確認します。 .gitattributesfilter=lfsのままにした場合、変更が正しく行われない可能性があります。
  7. 以前にリストされたすべてのLFSファイルがgit lfs ls-filesで存在しないことを確認します。
  8. ファイルを検査し(以前はLFSファイルを開いて、それらが破損していないことを確認します)、ビルドを実行してすべてが機能することを確認します。

チップ

  • ある時点でファイルシステムの衝突(./LICENSEや./Licenseなど)が発生した場合に備えて、大文字と小文字を区別するファイルシステムで実行します。
  • Gitは、すべてのfilter=lfsからすべての.gitattributes行を削除します。
  • .git/hooksディレクトリに残っているLFSを削除することもできます:コミット前、コミット後、チェックアウト後、マージ後。
  • $GIT_TRACE=1では、...trace git-lfs: filepathfilter: accepting...の兆候はないはずです
7
Doug Richardson