GitHubでは更新した履歴はすべて「History」で見えてしまいます。
そのため非公開鍵などを入れたままpushしちゃうと上書きしても履歴で見れちゃいます。
これ結構あるらしくて「GitHubで多くのユーザーが秘密鍵を公開状態にしていたことが判明」というエントリすらあります。
対処方法はGitHub Helpの「Remove sensitive data」に記述があります。
さっそく対処してみましょう。
ローカルフォルダの削除
GitHubでは、GitHubにあるリポジトリをローカルに「Clone」して作業をします。手順を単純化及び画一化するために、まずはWindowsマシンにあるローカルのフォルダを削除しちゃいましょう。
例えば、AsyncOAuthというリポジトリだと標準的な構成であれば、次のフォルダにあります。
ライブラリ\ドキュメント\GitHub\AsyncOAuth
ここの「AsyncOAuth」をフォルダごと削除しちゃいます。
クローンの実施
つぎにGit Shellを立ち上げます。
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.
C:\Users\hatsune\Documents\GitHub>
git cloneコマンドでリポジトリをローカルにもってきましょう。
C:\Users\hatsune\Documents\GitHub> git clone https://github.com/hatsunea/AsyncOAuth.git
Cloning into 'AsyncOAuth'...
remote: Counting objects: 191, done.
remote: Compressing objects: 100% (94/94), done.
remote: Total 191 (delta 83), reused 186 (delta 79)
Receiving objects: 100% (191/191), 304.88 KiB | 152 KiB/s, done.
Resolving deltas: 100% (83/83), done.
C:\Users\hatsune\Documents\GitHub>
この状態ではローカルフォルダに該当のファイルが存在します。
ファイルの強制削除
git filter-branchコマンドで履歴をバッサリ書き換えて該当のファイルを強制削除します。該当ファイルの指定はリポジトリルートからの相対パスになる点に注意してください。
例えば、AsyncOAuth.WIndowsStoreAppVBフォルダの中のMainPage.xaml.vbファイルを削除したいときは次のように入力します。
C:\Users\hatsune\Documents\GitHub> cd .\AsyncOAuth
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master]> git filter-branch --force --index-filter
'git rm --cached --ignore-unmatch AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
--prune-empty --tag-name-filter cat -- --all
Rewrite b1222ec07d61ec5eb964ecadbe0659c751e0322d (20/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 1db86a063112dc943a0c6ea2b22e9288c3ebff80 (21/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 43838c0a1f7221b33402d1ed6ca8f81ecce80ab6 (22/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 3a562e79e8e4534b0e0040e5888794604ffea28b (23/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 64663c9f5b7dffd35e67c0eb407c884968bf8dd0 (24/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 6299328b6095849838104bb2eae9e3952a969421 (25/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 016cbed15da88d47f954a99e95b32a5ed2a5df09 (26/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite 0cb796e651043c233ab5de000e1c3855e51ab33c (27/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Rewrite e5853f6ce36b737a1da1d378c4ae064eab9c4890 (28/28)rm 'AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb'
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master]>
非公開鍵の文字列を削除しようとして試行錯誤した部分がRewriteとして表示されます。
最後に「Ref 'refs/heads/master' was rewritten」が出れば完了です。最後のremotes/origin/master変更なしに対するWARNINGは無視して問題ありません。
これで、ローカルから該当のファイルが消えていることがわかると思います。
上書き用ファイルの作成
不要な情報を削除したMainPage.xaml.vbファイルを用意し、
ライブラリ\ドキュメント\GitHub\AsyncOAuth\AsyncOAuth.WindowsStoreAppVB
にコピーします。
正しいファイルのローカルリポジトリへの登録
ファイルをgit配下のフォルダにおけたのでローカル登録をまず実施します。
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master]> git add AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master +1 ~0 -0]>
次に変更点のコミットを行います。
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master +1 ~0 -0]> git commit -m "Visual Basic Sample for Windows Store Apps"
[master 3b92e3f] Visual Basic Sample for Windows Store Apps
1 file changed, 19 insertions(+)
create mode 100644 AsyncOAuth.WindowsStoreAppVB/MainPage.xaml.vb
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master]>
GitHubへの登録
これで正しいファイルがローカルリポジトリに登録されましたので、git pushコマンドをforceオプション付きでGitHubに登録します。
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master +1 ~0 -0]> git push origin master --force
Counting objects: 29, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (27/27), 19.96 KiB, done.
Total 27 (delta 8), reused 13 (delta 2)
To https://github.com/hatsunea/AsyncOAuth.git
+ e5853f6...3b92e3f master -> master (forced update)
C:\Users\hatsune\Documents\GitHub\AsyncOAuth [master]>
GitHubでの確認
GitHubでフィルを表示すると意図した内容になっていることが確認できます。
履歴には最新版のみでそれ以前の履歴はありません。
あーよかった。