web-dev-qa-db-ja.com

githubの要点の特定のリビジョンを削除するにはどうすればよいですか?

GitHubでGistを作成しましたが、誰にも見られたくない情報を見ました。それ以来、ファイルを更新しましたが、誰でもファイルの古いリビジョンにアクセスできます。

要旨を削除する以外に、その特定のリビジョンを確実に削除する方法はありますか?

そのような問題を抱えているのは私だけではないことがわかりました( Git:単一のリモートリビジョンを削除 )が、リビジョンを削除することはできませんでした。ここに示されているプロセスは、いくつかのファイルを削除するのに役立つようです。リビジョン全体を削除したい。

34
Cyril N.

Githubには、機密データの削除に関するヘルプページがあります。

http://help.github.com/removing-sensitive-data/

要旨は単なるgitリポジトリであるため、Gistをローカルで複製し、そこでクリーンアップを実行し、強制的にプッシュしてgithubバージョンをクリーンアップされたリポジトリで上書きできるはずです。

はい、それについて考えた後:<commit>が「削除」したいコミットである場合は、

 git rebase -i <commit>^

<commit>の行をeditとしてマークし、保存して終了します。

gitは、<commit>をコミットした後の状態に作業ディレクトリを設定します。ファイルを修正し、git addgit commit --amendを使用してコミットを修正します。次に、git rebase --continueを実行します。次のコミットで機密データを削除するだけの場合は、修正されたコミット後の変更が含まれていないため、おそらく自動的に削除されます。

次に、git Push -fを実行して、更新を強制します(これは、早送りではないため、既に公開されているgit履歴が変更されるためです)。

35
Tilman Vogel

受け入れられた答えは良いですが、従うのは少し難しいです。これは同じ答えですが、少し甘いです。

Tilman Vogelが言うように、要点は単なるリポジトリであるため、このアプローチは要点だけでなくgithubリポジトリでも機能します。

表示したくないパスワードを含むバージョンが1つだけあると仮定しましょう。パスワードを削除して新しいバージョンをチェックインし、以前のバージョンを削除したいと考えています。パスワードを示すコミットが多数ある場合は、このプロセスを適応させることができるはずです。

まず、修復はローカルマシン(githubではない)で行う必要があります。これを行うには、Gistをローカルに複製することから始めます。 githubのGistのページには、プライベートクローンのURLをクリックした場合にプライベートクローンを作成する方法が示されているはずです。何かのようなもの:

git clone [email protected]:421xxx1.git Gist-421xxx1

これにより、リベースする必要のあるローカルコピーが得られます(つまり、バージョンをいじくり回します)。

cd Gist-421xxx1
git rebase -i eexxaa^

ここで、eeccaaは、パスワードを含む(最初の)バージョンです。この番号は、Gistページのリビジョン列から取得できます。 ^は必須です。このコマンドは、 'バージョンをeexxaaから最新のものにインタラクティブに変更させてください。このコマンドは、リポジトリ内の各バージョンの各行にコマンドが入力されたエディターを開きます。デフォルトのコマンドは「pick」で、「このバージョンを使用または保持する」ことを意味します。

エディターの最初の行は次のようになります。

pick eexxaa    <- the version with the password
pick ffxxbb    <- the first version without the password

これをに変更します

pick eexxaa    
squash ffxxbb 

つまりパスワードのないバージョンでは、Wordの「pick」を「squash」に変更します。これにより、リベースは新しい(パスワードなしの)バージョンを古い(パスワードを保持する)バージョンに押しつぶすように求められ、基本的にバージョンeexxaaが削除されます。明らかに、あなたのバージョンはeexxaaまたはffxxbb以外になります。文字通りどこでもeexxaaまたはffxxbbを使用しないでください!

@kandが指摘しているように、パスワードを含むすべてのバージョンをsquashする必要があります。

エディターで保存して終了します(vi:xの場合)。リベースは、2つのバージョンのコミットメッセージを表示し、単一の結合されたコミットメッセージを要求する新しいエディターを開く必要があります。要旨の場合、これらのメッセージは空である可能性が非常に高いですが、ここに何かを入力する必要があります。そうしないと、リベースが中止されます。メッセージを入力して保存して終了すると、リベースが完了します。

これで、パスワードを含むバージョンのないリポジトリができました。これを要点に戻すには、次を使用します。

git Push -f

これにより、変更がgithubリポジトリに強制されます。更新を押すと、ブラウザで問題のあるバージョンが右側のリビジョン列から削除されたことを確認できるはずです。

それでおしまい!

24
meesern

Gistにリビジョンを表示する必要がない場合は、次の手順を実行してすべての履歴を削除し、1つのリビジョンのみを表示できます。

git clone some-Gist-repo
cd some-Gist-repo
git rebase -i --root $tip

その要点のすべてのコミットをエディターで確認できます。最初のものを選び、他のすべてをsまたはsquashに置き換えてください。完了したら、コミットメッセージを保存して追加し、このように強制的にプッシュしてマスターします。これで問題ありません。

git Push -f Origin master

表示される唯一のリビジョンは、ファイルの追加であり、それだけです。

3
Rafay

リポジトリから何かを完全に削除したい場合は、gitfilter-branchを使用する必要があります。

http://git-scm.com/docs/git-filter-branch

2
ralphtheninja

Meesernの答えに追加します。押しつぶしたり、修正してリベースしたりする場合は、続行する場合は、コメントまたは--allow-empty-messageを追加する必要があります。これには時間がかかり、どういうわけか私のコミットはそのようにすることでGistのリビジョンリストから消えることはありませんでした。

より簡単な解決策を見つけました。リベースのやることリストの不要なコミット行、:wq!git rebase --continue、およびgit Push -fを削除するだけです。

0
ShunS