799

現在、Github リポジトリにプッシュするローカル Git リポジトリがあります。

ローカル リポジトリには最大 10 個のコミットがあり、Github リポジトリはこれの同期された複製です。

私がやりたいことは、ローカル Git リポジトリからすべてのバージョン履歴を削除することです。これにより、リポジトリの現在の内容が唯一のコミットとして表示されます (したがって、リポジトリ内の古いバージョンのファイルは保存されません)。

これらの変更を Github にプッシュしたいと思います。

Git リベースを調査しましたが、これは特定のバージョンを削除するのにより適しているようです。別の潜在的な解決策は、ローカル リポジトリを削除して新しいリポジトリを作成することです。

ETA: 追跡されていない特定のディレクトリ/ファイルがあります。可能であれば、これらのファイルの追跡を解除したいと考えています。

4

18 に答える 18

1086

これが力ずくのアプローチです。また、リポジトリの構成も削除されます。

: リポジトリにサブモジュールがある場合、これは機能しません! サブモジュールを使用している場合は、インタラクティブなリベースなどを使用する必要があります

ステップ 1: すべての履歴を削除します (バックアップがあることを確認してください。これは元に戻すことはできません) 。

cat .git/config  # note <github-uri>
rm -rf .git

ステップ 2: 現在のコンテンツのみで Git リポジトリを再構築する

git init
git add .
git commit -m "Initial commit"

ステップ 3: GitHub にプッシュします。

git remote add origin <github-uri>
git push -u --force origin master
于 2012-03-13T11:44:55.310 に答える
750

私にとって機能する(そしてサブモジュールを機能させ続ける)唯一の解決策は

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

サブモジュールがある場合、削除.git/すると常に大きな問題が発生します。を使用git rebase --rootすると、どういうわけか競合が発生します(そして、多くの履歴があるため、時間がかかります)。

于 2012-10-27T18:16:44.770 に答える
113

これは私の好みのアプローチです:

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

これにより、HEAD にすべてを追加する 1 つのコミットで新しいブランチが作成されます。それ以外は何も変更しないので、完全に安全です。

于 2013-03-22T13:53:36.633 に答える
36

もう 1 つのオプションは、多くのコミットがある場合に大変な作業になる可能性があるため、インタラクティブなリベースです (git バージョンが 1.7.12 以上であると仮定します)。git rebase --root -i

エディターにコミットのリストが表示された場合:

  • 最初のコミットで「pick」を「reword」に変更
  • コミットごとに「pick」を「fixup」に変更します

保存して閉じます。Git がリベースを開始します。

最後に、その後のすべてのコミットを組み合わせた新しいルート コミットが作成されます。

利点は、リポジトリを削除する必要がないことです。考え直した場合は、常にフォールバックがあります。

本当に履歴を削除したい場合は、マスターをこのコミットにリセットし、他のすべてのブランチを削除してください。

于 2012-03-14T20:24:09.287 に答える
21

larsmansの提案された方法のバリアント:

untrackfiles リストを保存します。

git ls-files --others --exclude-standard > /tmp/my_untracked_files

git 構成を保存します。

mv .git/config /tmp/

次に、larsmans の最初の手順を実行します。

rm -rf .git
git init
git add .

構成を復元します。

mv /tmp/config .git/

追跡されていないファイルを追跡解除します。

cat /tmp/my_untracked_files | xargs -0 git rm --cached

次にコミットします。

git commit -m "Initial commit"

最後に、リポジトリにプッシュします。

git push -u --force origin master
于 2014-04-19T08:58:18.553 に答える
4

私がやりたいことは、ローカル Git リポジトリからすべてのバージョン履歴を削除することです。これにより、リポジトリの現在の内容が唯一のコミットとして表示されます (したがって、リポジトリ内の古いバージョンのファイルは保存されません)。

より概念的な答え:

タグ/ブランチ/参照がそれらを指していない場合、gitは自動的に古いコミットをガベージコレクションします。したがって、すべてのタグ/ブランチを削除し、任意のブランチに関連付けられた新しい孤立コミットを作成するだけです。慣例により、ブランチmasterがそのコミットを指すようにします。

到達不能な古いコミットは、低レベルの git コマンドで掘り下げない限り、二度と誰にも見られなくなります。それだけで十分な場合は、ここでやめて、必要なときにいつでも自動 GC に仕事をさせます。それらをすぐに取り除きたい場合は、git gc(おそらく--aggressive --prune=all) を使用できます。ただし、リモートの git リポジトリの場合、ファイル システムへのシェル アクセスがない限り、それを強制する方法はありません。

于 2016-04-04T11:27:13.633 に答える
4

git filter-branch主要な手術ツールです。

git filter-branch --parent-filter true -- @^!

--parent-filter親を標準入力に取得し、書き換えられた親を標準出力に出力する必要があります。unixtrueは正常に終了し、何も出力しないため、親はありません。 @^!は、 「親のコミットではなく、ヘッド コミット」のGit 省略形です。次に、他のすべての参照を削除し、暇なときにプッシュします。

于 2014-04-05T01:42:16.110 に答える
-1

プロジェクトからフォルダーを削除し、.gitIntelliJ を介してバージョン管理と再統合するだけで、同様の問題を解決しました。注:.gitフォルダーは非表示になっています。を使用してターミナルで表示しls -a、 を使用して削除できrm -rf .gitます。

于 2017-04-11T18:54:18.073 に答える
-1

そのためには、Shallow Clone コマンド git clone --depth 1 URL を使用します - リポジトリの現在の HEAD のみを複製します

于 2017-08-23T15:55:38.553 に答える