1. ホーム
  2. git

Git - "Refspec "とは何か

2023-11-08 18:59:43

質問

私はずっと このガイド を参考に、Jenkins を使って GitLab の継続的インテグレーションを設定しました。

その一環として、以下のようにrefspecを設定する必要があります。 +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

なぜこれが必要なのかは、投稿では説明されていないので、ネットで説明を探し始め、その中で 公式ドキュメント と、関連する StackOverflow の質問をいくつか見てみました。 このような .

にもかかわらず、まだ迷っています。

refspecとはいったい何なのでしょうか? そして、なぜ上記のrefspecが必要なのでしょうか。それは何をするためなのでしょうか?

どのように解決するのですか?

refspec は、リモートからの参照をどのようにローカルリポジトリにマッピングするかを git に指示します。

あなたが挙げた値は +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* です。では、それを分解してみましょう。

2つのパターンとその間にスペースがありますが、これは複数のルールを与えていることを意味します。 (pro git bookではこれを2つのrefspecsと呼んでいます。技術的にはこちらの方が正しいでしょう。しかし、必要であれば、ほぼ常に複数の refspec をリストする能力があるので、日常生活ではおそらくほとんど違いはないでしょう)。

では、最初のパターンは +refs/heads/*:refs/remotes/origin/* で、3つの部分を持っています。

  1. + は、そうすることで対象審判を早送りでない方法で動かすことになったとしても、失敗せずに規則を適用することを意味します。 これについてはまた後日。
  2. の前の部分は : (の後ろ(ただし + の後ろ)は "source"パターンです。 これは refs/heads/* の下にあるすべてのリモート参照に適用されることを意味します。 refs/heads (ブランチを意味する)の下にあるあらゆるリモート参照に適用されることを意味します。
  3. の後の部分は : は、"destination" パターンです。これは refs/remotes/origin/* .

ということで、原点に分岐がある場合 master と表現されます。 refs/heads/master である場合、これはリモートブランチの参照 origin/master として表されます。 refs/remotes/origin/master . そして同様に、任意のブランチ名 ( * ).

そこで話を戻して + ... 原点が

A --- B <--(master)

フェッチして、その参照仕様を適用すると、次のようになります。

A --- B <--(origin/master)

(典型的なトラッキングルールを適用して pull を使用している場合は master に向けられた B .)

A --- B <--(origin/master)(master)

さて、リモートでいくつかのことが起こります。 誰かが reset を消去して B を、そしてコミットした C をコミットし、その後プッシュを強制しました。 つまり、リモートは

A --- C <--(master)

フェッチすると

A --- B
 \
  C

の移動を許可するかどうか、git が決定しなければなりません。 origin/master から B から C . デフォルトでは、これは早送りではないので許可されませんが (その参照に対するプルを拒否したことを伝えるでしょう)、 ルールが + で始まるため、これを許可します。

A --- B <--(master)
 \
  C <--(origin/master)

(この場合、pullはマージコミットになります)。

二つ目のパターンも同様ですが merge-requests を参照する必要があります(これは、PRのサーバーの実装に関連していると推測されますが、私はそれについて詳しくありません)。

refspecs についての詳細です。 https://git-scm.com/book/en/v2/Git-Internals-The-Refspec