web-dev-qa-db-ja.com

ソフトウェアバージョンを管理するためにgitでタグをどのように使用しますか

プロジェクトの管理にはgitを使用します。それぞれにブランチがあります:dev staging production

ソフトウェアのバージョンを管理するためにgitタグを使用したい。私がブランチにいるかどうかを確認し、いくつかのコミットを追加する限り、次に実行する必要があります:git tag 1.0

現在のバージョン番号を1.0に変更してから、次のコマンドを使用してタグをプッシュできます。git Push Origin 1.0

そして、私はブランチを更新することができます:git Push --tags

しかし、どうすればタグを再利用できますか?ローカルリポジトリにさらにコードをコミットし、簡単にバージョン1.0にしたい場合はどうすればよいですか?または、1.1のような新しいタグを追加するだけですか?

また、同僚がローカルリポジトリで同じタグ名を使用していて、同じタグのコードを両方ともプッシュした場合はどうなりますか?

最後に、コミットにタグを付けるためにgit tagを実行せずに誤ってコードをプッシュした場合はどうなりますか?.

私は実際にはタグがどのように機能するのかわかりません。ブログの投稿などにタグを付けるのと同じように機能すると思いました-おそらく、同じタグで多くの異なるコミットにタグを付け、タグなどを再利用できます。

30
Frank M

しかし、どうすればタグを再利用できますか?ローカルリポジトリにさらにコードをコミットし、簡単にバージョン1.0にしたい場合はどうすればよいですか?または、1.1のような新しいタグを追加するだけですか?

git tag -d 1.0を使用してタグを削除してから、git Push Origin :refs/tags/1.0を使用してサーバー上でタグを削除できます。

ただし、ベストプラクティスは、リリースにタグを付け、タグが作成された時点でそのリリースのメンテナンスブランチを作成することです。そのブランチで、修正をプッシュし、更新されたリリースを作成するときに1.1、1.2、...のタグを付けます。そのコードを顧客に渡した後でタグを移動することは悪い習慣です。

また、同僚がローカルリポジトリで同じタグ名を使用していて、同じタグのコードを両方ともプッシュした場合はどうなりますか?

タグをプッシュする2人目の方がエラーを受け取ると思います。自分で試して、何が起こるかを確認してください。

git checkout -b testbranch
git tag test1
git Push Origin tag test1
git tag -d test1
touch testfile
git add testfile
git commit -m "Added testfile"
git Push Origin testbranch
git tag test1
git Push Origin tag test1

最後に、コミットにタグを付けるためにgit tagを実行せずに誤ってコードをプッシュした場合はどうなりますか?.

コミットをプッシュした後、タグをプッシュする必要があります。両方を同時に行うことはできません(git Push --tagsはコミットをプッシュせず、タグのみをプッシュします)。最初にタグをプッシュすると、コミットをプッシュするまで、リモートにぶら下がる参照があります。だからあなたはやるべきです

git Push Origin master
git Push Origin --tags

または同様に、状況に応じて。

私は実際にはタグがどのように機能するのかわかりません。ブログの投稿などにタグを付けるのと同じように機能すると思いました-おそらく、同じタグで多くの異なるコミットにタグを付け、タグなどを再利用できます。

タグはコミットのラベルのようなものなので、一部のコミットを「特別」としてマークできます。最も一般的には、これはリリースにタグを付けるために使用されるため、顧客がバグを報告した場合、いつでも戻ってそのリリースの内容を正確に確認できます。

9
Jonathan

タグ情報の優れたリソースは gitref.org にあります

バージョン番号を再試行しないでください。ベストは、単に1.1または1.0aに行くことです。これについては man page で詳しく説明しています。

あなたの質問:

最後に、コミットにタグを付けるためにgit tagを実行せずに誤ってコードをプッシュした場合はどうなりますか?

コマンドにcommit refを入れることで、古いコミットにタグを付けることができます。

git tag 1.1 HEAD~3
2
cmcginty

タイトルの質問に答えるだけで、私が指しているgitバージョンのタグでコードに自動的にタグを付けるセミプロのソリューション(一部の人には役立つかもしれません)を思いついたので、(ビルドするたびにバージョン番号を手動で更新することを忘れないでください。現在、私は小さなグループ(開発者5人未満)で働いており、構成管理はまだ進行中です。しかし、それが成熟するまで、これは私にとって有効な解決策です。

高レベルのビュー、これらはステップです:

  • 私は現在のバージョンのタグをgitにクエリするスクリプトを書きました( この回答の最初の部分を使用して )。

  • 抽出されたバージョンとその部分を_#define_ sするヘッダーファイルを自動生成します。

  • このスクリプトを実行する最上位のメイクファイルの早い段階でシェルコマンドを配置します(そのため、何かをビルドするたびにヘッダーファイルが生成されます)。
  • 関連するコード_#include_ sこのヘッダーファイル(リポジトリのではないの一部です)、そして出来上がりですが、バージョンは自動的に組み込まれ、手動で入力する必要はありません。

さらに詳細に:

スクリプト

私は現在、3つの番号のバージョン管理スキーム、major.minor.buildを使用しています。ここで、buildはおそらく文字列です(たとえば、 、v1.8.3b)。改行を印刷するために_echo -e_を使用することは私にとってはうまくいきますが、おそらく printfがより良いオプションです

_# queries git for the version tag I'm currently pointed at. Throughout SO there
# are different versions of this command, but this one works for me. And in fact
# all my tags are annotated, so I could just use "git describe"
VERSION=`git describe --tags`

# replace all the '.' with ' ', then split the array based on the spaces.
# Obviously this will have its limitations if there are spaces in your
# version tag, or maybe even wildcard characters, but that should never
# be the case for me
VER_ARRAY=(${VERSION//./ })
# pull out the major, minor, and build components. These can be used to
# pre-processor check different versions of my code for certain compatibility,
# should the need arise
V_MAJOR=${VER_ARRAY[0]}
V_MINOR=$(VER_ARRAY[1]}
V_BUILD=${VER_ARRAY[2]}

# all of my build tags are preceded by a 'v', so remove that simply by taking
# the substring starting at position 1
V_MAJOR=${V_MAJOR:1}

# define the path and header file
VERSION_HEADER=./path/to/codeVer.h

# write these to file. > creates the file and >> appends to the file
echo -e "// Auto-generated version header on " `date` "\n\n" > $VERSION_HEADER
echo -e "#define MY_CODE_VERSION \""$VERSION"\"\n\n" >> $VERSION_HEADER
echo -e "#define MY_CODE_MAJOR "$V_MAJOR >> $VERSION_HEADER
echo -e "#define MY_CODE_MINOR "$V_MINOR >> $VERSION_HEADER
echo -e "#define MY_CODE_BUILD \""$V_BUILD"\"\n\n" >> $VERSION_HEADER
_

メイクファイル

私のメイクファイルの先頭には、$(Shell ./genVer.sh)があります。これはmakeにシェルコマンドを実行するように指示します。_./genVer.sh_はスクリプトのパスと名前です。これを行うためのより良い方法は、スクリプトに_.PHONY_ターゲットを作成し、そのターゲットを適切なターゲットの前提条件として置くことですが、多くのターゲットがあり、これは1行のキャッチですすべて。

コード

今、関連するすべてのソース/ヘッダーファイルで、私は単に

_#include "codeVer.h"
....
#ifndef MY_CODE_VERSION
  // although if codeVer.h cannot be found we will get a fatal error before
  // this warning
  #warning "Unable to find code version, defaulting to v0.0.0"
  #define MY_CODE_VERSION "v0.0.0"
#endif
_

makeを実行すると、現在のバージョンが抽出され、ヘッダーが生成され、コードがファイルの_#include_ sになり、手動で作業しなくても正しいバージョン番号が取得されます。これは最新バージョンでは機能しないことに注意してください。古いタグをチェックアウトすると、同様に機能します(もちろん、これを実装する変更がそのバージョンにあった場合)。

これには欠点があります。最も顕著に

  1. バージョンを取得するには、何かをビルドする必要があります。リポジトリで追跡したくないため、実際に_codeVer.h_を.gitignoreリストに追加しました。これは、このファイルが欠落している誰かにコードを渡す可能性があることを意味し、彼らはそれがどのバージョンであるかを知りません。しかし、彼らがgitを使用していて(彼らがそうしているはずのように!)、彼らがあなたのものを_git pull/clone_した場合、とにかくすべてのタグがそれに付属します。
  2. _make clean_もこのファイルを生成します(直感に反するように見えます)が、正しい方法で実行し、上記のように_.PHONY_ターゲットを使用した場合、それは問題にはなりません。
  3. たぶん、今は考えていません。
2
yano