128

シンプルなソース コード管理ツールについての質問をたくさん読みましたが、Git は妥当な選択のように思えました。私はそれを稼働させており、これまでのところうまく機能しています。私が CVS で気に入っている点の 1 つは、バージョン番号が自動的にインクリメントされることです。

これは分散リポジトリではあまり意味がないことを理解していますが、開発者として、私はこのようなものが欲しい/必要です. 理由を説明しましょう:

私はEmacsを使っています。私は定期的に、サードパーティのパッケージ用の Lisp ソース ファイルの新しいバージョンを調べて探します。ヘッダーによると、バージョン 1.3 のファイル foo.el があるとします。最新バージョンを調べて、それが 1.143 か 2.6 か何かであることがわかった場合、かなり遅れていることがわかります。

代わりに、40 文字のハッシュが 2 つ表示された場合、どちらが後なのか、またはどれくらい後なのかがわかりません。自分がどれだけ時代遅れかを知るためだけに手動で ChangeLog をチェックしなければならないとしたら、それは絶対に嫌です。

開発者として、私が見ているように、この礼儀を私の出力を使用する人々に広げたいと思っています (そして、誰かがそうであると冗談を言っているのかもしれませんが、それはしばらく脇に置きましょう)。毎回自分でいまいましい数字をインクリメントすること、またはタイムスタンプなどを覚えておく必要はありません。それは本当のPITAであり、私は経験からそれを知っています.

それで、私にはどのような選択肢がありますか?$Id:$ に相当するものを取得できない場合、探しているものを他にどのように提供できますか?

私の予想では、エンド ユーザーは Git をインストールしておらず、たとえインストールしていたとしても、ローカル リポジトリを持っていないということです (実際、そのような方法で利用できるようにしないことを期待しています)。

4

18 に答える 18

68

SHA はバージョンの 1 つの表現にすぎません (正規ではありますが)。コマンドは他のgit describeものを提供し、非常にうまく機能します。

たとえば、 Java memcached クライアントソースgit describeのマスター ブランチで実行すると、次のようになります。

2.2-16-gc0cd61a

これは、次の 2 つの重要なことを示しています。

  1. 2.2 以降、このツリーにはちょうど 16 件のコミットがありました
  2. 正確なソース ツリーは、他の誰のクローンにも表示できます。

たとえば、その番号を表示するために、versionファイルをソースと共にパッケージ化した (または配布用にすべてのコンテンツを書き直した) とします。2.2-12-g6c4ae7aパッケージ化されたバージョンが(リリースではなく、有効なバージョン) だったとしましょう。

これで、自分がどれだけ遅れているか (4 つのコミット)を正確に確認できるようになり、どの 4 つのコミットが正確に行われたかを確認できます

# The RHS of the .. can be origin/master or empty, or whatever you want.
% git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a
c0cd61a Dustin Sallings More tries to get a timeout.
8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui
fb326d5 Dustin Sallings Added a test for bug 35.
fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.
于 2008-12-22T04:03:29.063 に答える
57

今では、Git で $Id:$ がサポートされています。ファイルREADMEで有効にするには、「README ident」を.gitattributesに入れます。ファイル名のワイルドカードがサポートされています。詳細については、 man gitattributesを参照してください。

于 2011-02-16T22:21:14.560 に答える
32

これは、OP からの不当な要求ではありません。

私のユースケースは次のとおりです。

  1. 私は自分の個人的なコードに Git を使用しているため、他の人とのコラボレーションはありません。
  2. システムの Bash スクリプトは、/usr/local/bin準備ができたときに実行される可能性があります。

私は同じ Git リポジトリを持つ 3 台の別々のマシンを使用しています。/usr/local/bin手動で「diff -u <repo version> <version in /usr/local/bin>」を実行しなくても、現在使用しているファイルの「バージョン」を知ることができれば便利です。

否定的な人は、他にも使用例があることを思い出してください。Git リポジトリ内のファイルを「最終的な」場所として、誰もが共同作業に Git を使用しているわけではありません。

とにかく、私がやった方法は、次のようにリポジトリに属性ファイルを作成することでした:

cat .git/info/attributes
# see man gitattributes
*.sh ident
*.pl ident
*.cgi ident

次に、$Id$ をファイルのどこかに置きます (シバンの後に置くのが好きです)。

コミット。これは、私が期待したように自動的に展開されないことに注意してください。たとえば、ファイルを再作成する必要があります。

git commit foo.sh
rm foo.sh
git co foo.sh

次に、展開が表示されます。たとえば、次のようになります。

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

Git リポジトリの ident 文字列を有効にするにはどうすればよいですか? にいくつかの良い情報があります。.

于 2012-08-04T09:38:10.240 に答える
23

これが Git になるかどうかはわかりません。ライナスを引用するには:

「キーワード置換の概念全体はまったくばかげています。リリース ツリーを tar ボールなどとして実行するときに、実際のコンテンツ トラッキングの「外側」を実行するのは簡単です。」

ただし、ログを確認するのは非常に簡単です。foo.el の安定版ブランチを追跡している場合は、ローカル コピーにはない安定版ブランチのログにある新しいコミットを確認できます。CVS の内部バージョン番号をシミュレートしたい場合は、最後のコミットのタイムスタンプを比較できます。

編集:もちろん、これを手動で行うのではなく、他の人のスクリプトを作成または使用する必要があります。

于 2008-12-21T04:54:49.507 に答える
21

私が前に書いたように:

賢明なバージョン番号を示す Id タグを自動的に生成することは、Bazaar のような DSCM ツールでは不可能です。したがって、誰かがファイルのバージョン「1.41」を参照する可能性がありますが、そのファイルのバージョン「1.41」は異なります。

基本的に、$Id$ は、Bazaar、Git、およびその他の分散ソース コード管理ツールでは意味がありません。

于 2008-12-21T16:37:14.630 に答える
10

私も同じ問題を抱えていました。ハッシュ文字列よりもシンプルで、リポジトリに接続しなくてもツールを使用できるバージョンが必要でした。

私は Git pre-commit フックを使ってそれを行い、スクリプトを変更して自動的に更新できるようにしました。

バージョンは、実行されたコミットの数に基づいています。これは、2 人が同時にコミットする可能性があり、両方とも同じバージョン番号をコミットしていると考えているため、わずかな競合状態ですが、このプロジェクトには多くの開発者がいません。

例として、Ruby でチェックインするスクリプトがあり、それにこのコードを追加します。これは非常に単純なコードであるため、別の言語で何かをチェックインする場合、別の言語に簡単に移植できます (明らかにこれはテキストファイルなどの実行不可能なチェックインでは簡単に機能しません)。私は追加しました:

MYVERSION = '1.090'
## Call script to do updateVersion from .git/hooks/pre-commit
def updateVersion
  # We add 1 because the next commit is probably one more - though this is a race
  commits = %x[git log #{$0} | grep '^commit ' | wc -l].to_i + 1
  vers = "1.%0.3d" % commits

  t = File.read($0)
  t.gsub!(/^MYVERSION = '(.*)'$/, "MYVERSION = '#{vers}'")
  bak = $0+'.bak'
  File.open(bak,'w') { |f| f.puts t }
  perm = File.stat($0).mode & 0xfff
  File.rename(bak,$0)
  File.chmod(perm,$0)
  exit
end

次に、スクリプトにコマンド ライン オプション (-updateVersion) を追加します。これを「tool -updateVersion」と呼ぶと、「MYVERSION」の値自体を変更して終了するツールの updateVersion が呼び出されます (必要に応じて、他のファイルも開いている場合はそれらも更新します)。

セットアップが完了したら、Git ヘッドに移動し、実行可能な 1 行の bash スクリプトを で作成し.git/hooks/pre-commitます。

スクリプトは単に Git ディレクトリの先頭に移動し、-updateVersion.

チェックインするたびに、-updateVersion を使用してスクリプトを実行する pre-commit スクリプトが実行され、コミット数に基づいて MYVERSION 変数が更新されます。魔法!

于 2012-11-12T23:25:24.637 に答える
8

Git リポジトリで行われることは、tagオブジェクトを使用することです。これは、あらゆる種類の文字列でコミットにタグを付けるために使用でき、バージョンをマークするために使用できます。git tagすべてのタグを返すコマンドを使用して、リポジトリ内のそのタグを確認できます。

タグをチェックアウトするのは簡単です。たとえば、タグがある場合、次のようにv1.1そのタグをブランチにチェックアウトできます。

git checkout -b v1.1

これは最上位のオブジェクトであるため、そのコミットまでの全履歴が表示され、差分の実行、変更、およびマージが可能です。

それだけでなく、タグがあったブランチがメインラインにマージされずに削除された場合でも、タグは存続します。

于 2008-12-21T10:18:25.033 に答える
8

$Keywords$ が不可欠な場合は、代わりにMercurialを試してみてはいかがでしょうか? 必要なものを実装する hgkeyword 拡張機能があります。とにかく、Mercurial は DVCS として興味深いものです。

于 2008-12-21T10:35:42.020 に答える
4

私が正しく理解していれば、基本的に、最後に更新してから特定のファイルで発生したコミットの数を知りたいと思います。

master最初にリモートオリジンで変更を取得しますが、ブランチにマージしないでください。

% git fetch

master次に、ブランチとリモートの間の特定のファイルで発生した変更のログを取得しますorigin/master

% git log master..origin/master foo.el

これにより、最後ににマージしてからリモートリポジトリで発生したすべてのコミットのログメッセージが表示origin/masterされますmaster

変更のカウントだけが必要な場合は、にパイプしwcます。このように言う:

% git rev-list master..origin/master foo.el | wc -l
于 2008-12-21T06:14:06.413 に答える
4

人々に彼らがどれだけ古くなっているかを知ってもらいたいだけなら、Gitはいくつかのかなり簡単な方法でそれを彼らに知らせることができます。たとえば、トランクとトランクの最後のコミットの日付を比較します。彼らはgit cherry、自分のトランクに存在しないコミットがトランクでいくつ発生したかを確認するために使用できます。

それがあなたがこれを望むすべてであるならば、私はバージョン番号なしでそれを提供する方法を探します。

また、あなたがそれを望んでいると確信していない限り、私は誰にも礼儀を拡張することを気にしません。:)

于 2008-12-21T06:33:20.043 に答える
0

あなたは Emacs を使っているので、ラッキーかもしれません :)

私は偶然にもこの質問に出くわしました。また偶然にも、数日前にLivelyに出会いました。これは、ドキュメントに Emacs Lisp の活発な部分を含めることができる Emacs パッケージです。正直なところ、試したことはありませんが、これを読んで頭に浮かびました。

于 2009-04-26T18:17:31.687 に答える