12

Git を使用して SVN リポジトリをインポートします。次に、リポジトリのサブフォルダーとして独自のプロジェクトを作成しました。

Git-SVN で SVN リポジトリを使用しています。私の作業手順は次のとおりです。

  1. git commit -am "message"
  2. git svn rebase
  3. git svn dcommit.

今、私は自分のプロジェクトにタグを付けたいとgit tag -a RC1 -m 'Release Candidate 1'思っていますが、自分のプロジェクトがタグを取得したいだけです。

どうやってやるの?

4

4 に答える 4

17

TL;DR バージョン

ツリーの SHA-1 を知っていれば、特定のディレクトリ (別名ツリー) にタグを付けることができますが、そのタグを使用して便利なことを行うのは簡単ではありません。

長い答え

Git のすべてのオブジェクトには、一意の SHA-1 があります。最も一般的には、SHA-1 はコミットを指しますが、ブロブ (ファイルの内容) とツリー (ディレクトリ構造とファイル名/ファイル許可のマッピング) を指すこともあります。これについては、Git オブジェクトのドキュメントを参照してください。

たとえば、リポジトリ内の特定のディレクトリにいるとします。実行git ls-tree HEADして、パス内のファイル/ディレクトリのリストとそれらの SHA-1 を取得できます。

$git ls-tree HEAD
100644 blob ed76d466f5025ce88575770b07a65c49b281ca59    app.css
100644 blob ed58ee4a9be6f5b58e25e5b025b25e6d04549767    app.js
100644 blob e2bed82bd9554fdd89d982b37a8e0659fe82390a    controllers.js
040000 tree f888c44e16f7811ba69a245adf35c4303cb0d4e7    data
100644 blob d68aa862e4746fc9abd0132cc576a4df266b0a9d    directives.js
100644 blob df0ae0e7288617552b373d21f7796adb8fb0d1b6    index.html
040000 tree fa9c05b1bb45fb85821c7b1c27925b2618d646ac    partials
100644 blob 28e9eb6fe697cb5039d1cb093742e90b739ad6af    services.js

data次に、これらのツリーの 1 つにタグを付けることができます (上記のディレクトリとしましょう)。

$git tag data-1.0 f888c44e16f7811ba69a245adf35c4303cb0d4e7

タグはその SHA-1 のエイリアスになり、ツリーの SHA-1 が受け入れられる場所ならどこでも使用できます。

$git ls-tree -rt data-1.0
100644 blob 6ab0a52a17d14cbc8e30c4bf8d060c4ff58ff971    file1.json
100644 blob e097e393fa72007b0c328d67b70ba1c571854db0    file2.json
040000 tree 39573c56941fdd2fc88747a96bf871550f4affb2    subfolder1
...    ...  ...                                         ...

元の SHA-1 に戻すには:

$git rev-parse data-1.0
f888c44e16f7811ba69a245adf35c4303cb0d4e7

このすべてがあなたに何の利益をもたらすでしょうか?あまりそのままではありません。ただし、ツリーの内容を再構築したり、ツリーを含むコミットを見つけたりするために独自のスクリプトを作成したい場合は、役に立つかもしれません。(たとえば、このSOの回答は、そのような目的に適合させることができます)。

しかし、他の人が言ったように、既存のモデルを適応させようとするよりも、Git でうまく機能するバージョン管理/タグ付けモデルを使用する方がおそらく簡単です。shikjohari などで既に述べたように、独自のバージョンを持つプロジェクト内のプロジェクトが必要な場合は、代わりにGitサブモジュールを検討してください。

于 2015-07-29T21:45:14.920 に答える
6

それはいけません。

Git では、設計上のタグは常にリポジトリ全体に適用されます (コミットやブランチと同様)。これは、タグ (単なるコピー) をサブツリーに適用できる Subversion とは異なります。

ところで: ツリーのどの部分がタグ付けされたかだけですぐに混乱する可能性があるため、Subversion でもサブツリーにタグ付けすることは通常お勧めできません。私が知っているほとんどのソース (たとえば、Subversion を使用したバージョン管理では、常にコピーしてタグ付けすることをお勧めしtrunkます。

あなたの問題について:

通常、個別のプロジェクトは個別の Git リポジトリを取得する必要があります。このコンテキストでの「個別」は通常、分岐/タグ付けを個別に行うことを意味します。

あなたがそれをしない/できない場合、最良のオプションはおそらくいくつかのタグプレフィックスを使用し、すべてのタグを呼び出すmyproj-1.0などですmyproj-1.1.

于 2012-10-09T12:48:16.577 に答える
3

これは Git では不可能です。Git タグは特定のコミットへのポインタですが、Subversion タグは Subversion リポジトリ内の任意のフォルダのコピーです。Subversion で 1 つのフォルダーにタグを付けるという概念は、Git にはうまく反映されません。

問題は、初期設定が Git の分岐モデルと一致しないことです。これを Git に適した方法で行うには、プロジェクト用にブランチを設定し、そのブランチのコミットにタグを付けます。

いくつかのオプションがあります。

  • を使用して、特定の時点でリポジトリ全体にタグを付けますgit svn taggit help svnこのコマンドの使用方法については、実行してください。

  • 通常の Subversion コマンドを使用してディレクトリにタグを付けます。を実行するだけなので、Subversion の作業コピーをダウンロードする必要はありませんが、Subversionsvn copy {URL to your project on the repository} {URL to your tag directory}をインストールする必要があります。

  • まったく新しいディレクトリで、Subversion リポジトリの新しい Git クローンを開始します。実際のトランクではなく、プロジェクト フォルダーをトランク URL として指定します。Git-svn はそのディレクトリをメイン ブランチとして扱い、Subversion を介してタグ付けおよびコピーできるようにします。

于 2012-10-09T12:51:39.150 に答える
1

非常に大規模なプロジェクトを Git に移行しなければならなかったとき、私は同様の問題に直面しました。チームが SVN を適切に処理しておらず、好きな場所からタグ付けを行っていることがわかりました。そのため、個々のプロジェクトとフォルダーのタグがありましたが、これは非常にお勧めできません。

Git への移行を計画している場合は、Git での動作を維持し、クリーンな状態に保つ必要があります。頻繁に変更されるプロジェクトの個別のリポジトリを作成することをお勧めします。また、プロジェクトが他のプロジェクトに依存している場合は、サブモジュールを利用できます。

于 2015-01-09T08:15:23.280 に答える