2017-02-08 13 views
0

gitでは、特定のコミットを「マーク」したいと思います。たとえば、ソフトウェアのREST APIを壊すコミットを「マーク」して、メジャーバージョン番号にバンプすることを覚えておきたいと思います。 (私はsemantic versioningを使用します)。gitを使ってセマンティックバージョン管理を制御する

理想的には、最後のリリース/タグ以降にコミットに「マーク」が含まれているかどうかを確認するには、gitコマンドを発行する必要があります。メジャー・ナンバーにバンプする必要があります。

タグは一意であるため、「マーク」はタグではありません(gitという用語ではありません)。私は、APIが壊れていることを知らせるために、最後のリリース以来、いくつかの同一の "マーク"が存在することが予想されます。

現在の回避策は、コミットメッセージに「MAJOR:」または「MINOR:」と書くことです。

これに対してgitをどのように使用できるかについての提案はありますか?

+0

しかし、gitのタグの主な機能は、主なバージョン(リリースポイント)です。注釈付きタグはコミットとほぼ同じです。 –

答えて

1

それは、タグ名がでなければならないというのは本当だユニークな、しかしmark/から始まる無限の数のユニークなタグ名のがある、などmark/1mark/2、というように。または、refs/tags/にない参照名を使用することもできます。

highmark=$(git for-each-ref --format='%(refname)' refs/marks | wc -l) 
nextmark=$((highmark + 1) 
git update-ref refs/marks/m$nextmark HEAD 

(これは任意の、git update-ref -dで、削除決して前提としています。それは、タグや他の参照が1の祖先コミットし、別の子孫であるかどうかを検出する方が簡単ですが、またはあなたが、Gitリポジトリの「ノート」を使用することができますこれらのマークのうち、「高い評価」を行う場合は、単純に数えるのではなく、最高の既存の数を見つけなければなりません)。また

if git merge-base --is-ancestor T1 refs/marks/m$N && 
    git merge-base --is-ancestor refs/marks/m$N HEAD; then 
     ... mark N is at or beyond tag T1 and at or before HEAD ... 
else 
     ... mark N is not between those two points (inclusive) ... 
fi 

、あなたがリポジトリ内または外で、保存可能性がある、とリポジトリ内、平野にブロブ - ブロブはGitリポジトリの内部にある場合:マーク$ Nは、タグT1とHEAD「間」されたかどうかをテストするために、 rawファイルデータの形式 - すべての「マーク済み」コミットのハッシュIDを含むファイル。ファイルそのものは、ブランチ上にあってもなくてもよく、タグ付き参照または他の参照先のコミットに格納できます。またはブロブ自体にタグを付けることができます。例えば:

git show marks > /tmp/all-marks  # extract existing marks 
git rev-parse HEAD >> /tmp/all-marks # add a new mark 
git tag -f marks $(git hash-object -w --stdin < /tmp/all-marks) 

あなたがコミット下ブロブを保存する場合は、それぞれの新しい更新のための新しいコミットを行うことで、マークの履歴を保持することができますが、ファイル「のIDをマーク」。これは、ある意味ではgit notesの作業と似ていますが、名前がコミットのIDであるファイルを書くのではなく、単に "marks"という名前のファイルを作成しています(コミットによってツリーに格納され、上記のタグの例のように、refs/tags/marksのようなタグであるか、上記の参考文献のmシリーズのような参照番号refs/marksのような参照であっても、1つの参照のみを使用している)。各コミットに親ポインタがあるので、直前のコミットを保存することができます。以前のコミットを保存して、以前のBLOB /マークファイルを保存します。git logを実行して、など


まあ、有限のが、唯一のディスクスペースと名のパターンによって制限されます。ここで提案されているパターンは、単一の名前空間でファイル名の中で小数点以下を数えて、典型的なUnix-ishファイルシステム上では25532バイトのコンポーネント名の長さの制限で1と数えることができます。具体的に言えば、名前を階層的にする前に、何千もの過去のことを望んでいないはずです(例えば、refs/marks/123/456/789)。

のOSはまた、最大パス長を課すが、あなたはそれらのヒットする前に長いIDをアウトの実行にコミットします:2 のみ1 461 501 637 330 902 918 203 684 832 716 283 019 655 932 542 976が、であるか、またはshort scale命名法では約1.462セクゼクリオン。さらに悪いことに、ハッシュコリジョンの可能性は、数キンリオンのオブジェクトの後ではあまりにも高くなるので、おそらくは10になるだけです。

関連する問題