例えば GitHub でそれなりに大きなリポジトリを Fork して master のコードをちょちょっと弄りたいとします。
Fork で元のリポジトリのすべてのブランチとタグがコピーされますが、私が欲しいのは master だけでそれ以外のブランチもタグも必要ありません。
Clone する
GitHub で Fork したリポジトリを clone します。私はいわゆる PHPer なので php-src の Fork を使います。
$ git clone git@github.com:ngyuki/php-src.git -b master --single-branch
master 以外は要らないので -b master --single-branch
で master だけ clone します。
この時点でローカルブランチは master しかありません。
$ git branch
* master
タグは master ブランチまでの経路上にあるものが clone のときに付いてきます。
$ git tag
NEWS
php-5.3.23RC1
php-5.4.4RC2
リモートのブランチを消し去る
git push --prune <remote> <refspec>:<refspec>
で、ローカルに存在しないリモートのブランチを消し去ります。
$ git push --prune origin "refs/heads/*:refs/heads/*"
--prune
は、ローカルにあってリモートに存在しないブランチを削除するオプションです。
<refspec>:<refspec>
は <local>:<remote>
の形式です、ローカルの refs/heads/*
をリモートの refs/heads/*
に push する、という意味です。
refspec の代わりに --mirror
を指定しても概ね同じですが、--mirror
だと refs/remotes/origin/*
まで push されてしまって不都合です。
リモートのタグを消し去る
次はタグを消し去ります。
master にくっついて幾つかのタグがローカルに作られているので、ブランチを消したときと同じ手順だとそれらのタグが残ってしまいます。
なので、存在しない ref を指定してリモートのタグをすべて消し去ります。
$ git push --prune origin "refs/dummy/*:refs/tags/*"
ローカルのタグはそのまま残っているので、git fetch --prune --tags
で消し去ります。
$ git fetch --prune --tags origin
タグを消し去る(別の方法)
ローカルのタグをすべて消してから git push --prune --tags
の方が手っ取り早いかもしれません。
$ git tag | xargs git tag -d
$ git push --prune --tags origin
--tags
は次のように指定しているのと大体同じです。
$ git push --prune origin "refs/tags/*:refs/tags/*"
やっぱ戻したい
upstream からブランチやタグを引っ張ってきて、追跡ブランチやタグを自分のリモートリポジトリに push すれば OK です。
$ git remote add upstream https://github.com/php/php-src.git
$ git fetch upstream
$ git fetch upstream --tags
$ git push origin "refs/remotes/upstream/*:refs/heads/*"
$ git push origin --tags
さいごに
push する前に -n
で何が起こるかを確かめてからやった方が良いです。