Git - "Refspec "とは何か
質問
私はずっと このガイド を参考に、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つの部分を持っています。
-
は
+
は、そうすることで対象審判を早送りでない方法で動かすことになったとしても、失敗せずに規則を適用することを意味します。 これについてはまた後日。 -
の前の部分は
:
(の後ろ(ただし+
の後ろ)は "source"パターンです。 これはrefs/heads/*
の下にあるすべてのリモート参照に適用されることを意味します。refs/heads
(ブランチを意味する)の下にあるあらゆるリモート参照に適用されることを意味します。 -
の後の部分は
:
は、"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
関連
-
gitlab をアップロード ! [リモート拒否] dev -> dev (受信前のフックが拒否されました)
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解决[email protected]。パーミッションが拒否されました (publickey)。リモートリポジトリから読み取れませんでした
-
git push please tell me who you are or git fatal: empty ident name (for <>) not llowed.
-
git reports an error fatal: unable to auto-detect email address (got 'Administrator@MS-20180504MMDH.(none)')
-
[解決済み] Gitの本番環境へのプッシュ(FTP)
-
[解決済み] フォルダからサブモジュールのリポジトリを作成し、そのgitコミット履歴を保持する
-
[解決済み] .gitignoreで特定のファイルを除外する
-
[解決済み] 以前のコミットにファイルを追加するには?
-
[解決済み] 別のユーザーでコードをコミットするにはどうすればよいですか?
-
[解決済み] 非標準のポートでリモートリポジトリを使用する
-
[解決済み] git add を実行してもしなくても、ブランチを切り替えたときに自分の変更点(修正、追加、削除されたファイル)が表示され続けるのはなぜですか?