2011-02-01 24 views
3

純粋に投機的なコミットがあり、うまくいかなかったとします。私はそれを維持したいと思いますが、私は参考にしたくありません(私は、ブランチやタグを「ワン・シングル・スペキュレーション・コミット」とは言いたくありません。私は支店名を「投機的」にして、すべてのコミットをその中に入れることができますが、コミットは完全に無関係であり、コミットとその親との間のつながりは不合理です。本質的には、gcによって削除されないコミット用のsha1 idsをリストアップすることができるようにしたいと思いますが、それぞれについてrefを必要としません。それを行うには良い方法は何ですか? (gc.pruneExpireを高い値に設定することは望ましくありません。なぜなら、プルーニングしたいだけなので、参照されていないコミットの特定のセットを保持したいからです。)つまり:コミットが決して削除されないようにするにはどうすればよいですか?

完全に無関係なコミットのコレクションを参照する良い方法はありますか?

答えて

3

解決方法は比較的簡単です。

 
$ git update-ref refs/speculative/SHA1 SHA1 

git-gcはrefを尊重し、削除しないようです。保護されたコミットをして簡単に一覧表示することができます。

 
$ git show-ref | grep refs/speculative 

私がこれまでに気づく唯一の欠点は、--lost-たHEADというのgit fsckは、彼らがぶら下がっていると報告しています。

+0

'git fsck'に' HEAD'を渡しません。これは、HEADの外側にコミットがあれば、ダンプすることになります。代わりに 'git fsck --unreachable'を実行するほうがいいです – bdonlan

+0

+1:私はこれをmipadiの答えの代案として提案しようとしていました。いくつかの注意点があります.SHA1だけでなく、REFの実名を後で伝える必要があります。それらはブランチやタグのように、それらの名前空間のすぐ外側にあります。他の参考文献と同様に、記述的に名前を付けてください。 'git for-each-ref refs/speculative/*'を使ってそれらをリストすることもできます。 – Cascabel

+0

私は一意性を保証し、名前を付けるのに必要な労力を最小限に抑えるために、名前としてsha1を使用することに決めました。それらを区別することは、各コミットメッセージの最初の行をリストすることで十分です。 –

2

git stashを使用することができます。これは基本的に 'stash'と呼ばれるrefに接続され、git show-branchなどのすべてのツールは無視されます。

または、偽のリモートでそれぞれにブランチを使用できます。 refs/remotes/graveyard/an-experiment--branchesには含まれていませんが、--allに含まれているため、プルーニングされません。

+1

'git stash'の通常の使用を妨げるため、git stashを使用することはお勧めできません。つまり、作業中のデータの一時的な格納 – bdonlan

+0

私はしばらく隠して遊んでいましたが、 stashingのための隠しを使用する方法。偽のリモートは良いアイデアです。しかし、私はまだそれぞれに固有の名前が必要でしょうか?私はむしろブランチ名よりもコミットメッセージに記述を入れたいと思っています。 –

+0

説明をリモートに配置する前に、記述をコミットに入れることができます。全体的なブランチ記述に「エンベロープ」コミットを追加したい場合は、 'git commit --allow-empty'を使って空のコミットを最後に追加してください。 – bdonlan

4

私は軽量タグを使用してコミットにタグを付けています。私はそれがあなたが本当にしたい解決策ではないことを知っていますが、それは私の意見では最高のものです。タグ付きコミットは決して消去されず、分岐をリストするときには表示されません。タグを表示するときに表示されますが、本当に表示したくない場合は、共通の接頭辞で各タグを開始し、git別名を使用してそれらを除外することができます。次のようなものがあります:

[alias] 
    tags = !sh -c 'git tag | grep -v my_prefix' 
関連する問題