gitolite リポジトリに新しいリポジトリを作成するときは、コードをサーバーにプッシュする前に、常に次のコマンドを入力する必要があります。
git push origin master:refs/heads/master
それは何をするためのものか ?
私の推測では、それは不明なヘッド参照に関係しているということです。誰かが私にそれを説明できますか?
このコマンドには3つの部分があります。
git push
これにより、プッシュコマンドが呼び出されます
origin
これは、プッシュ先のリモートに名前を付けます。これは、.git / configに保存されている名前付きリモートの1つ(これらはでリストできますgit remote
)、URL、または.
現在のリポジトリを意味するトークンのいずれかです。
master:refs/heads/master
これは「refspec」と呼ばれ、のマニュアルページで読むことができますgit push
。しかし、一般的には、コロンで区切られた2つの部分で構成されます。最初の部分はローカルブランチの名前であり、2番目の部分はリモートリポジトリ(この場合origin
)のブランチの名前です。この特定のrefspecは、に短縮できますmaster:master
。
一般に、refspecをさらに短くすることができます。refspecとして指定するだけmaster
で、リモートで同じ名前を使用するのと同じであるためmaster
、と同じmaster:master
です。
master:refs/heads/master
refspecです。
refspecs
の形式です+<src>:<dst>
したがって、ここでマスターはrefs/heads/master
、リモート(オリジン)のrefspecにプッシュしているローカルリポジトリのrefです。実際にmaster
はの略です。refs/heads/master
git push origin master
実際、ローカルのマスターをリモートのマスターにプッシュするだけで実行できます。別の参照にプッシュする場合にのみ、宛先参照を明示的に指定する必要があります。
また git push
、デフォルトの動作もあります。これは、最初のプッシュを実行してリモートにブランチ(マスター)を作成する前はおそらくそうではなかったでしょう。したがって、あなたが言及したコマンドを実行する必要があるように見えたでしょう。マニュアルを参照してください
のデフォルトの動作はgit push
、おそらく「コードをサーバーにプッシュする」と表現するものであり、プッシュ先のリモートで、名前によって一致するブランチを持つローカルブランチのみをプッシュすることです。新しいリポジトリを作成すると、ブランチが含まれないため、単純なものでgit push
は何もプッシュされません。最初に名前でブランチを明示的にプッシュする必要があります。その後、デフォルトの動作は期待どおりに機能します。
PS実際には、あなたはただする必要がありますgit push origin master
。別の名前を指定しなかったため、ローカルマスターをマスターとしてgitoliteリポジトリにプッシュします。あなたが言った場合git push origin master:foo
、あなたがローカルで「マスター」と呼ぶブランチは、gitoliteでは「foo」として知られています。
PPSデフォルトのプッシュ動作は、「nothing」、「matching」(デフォルト)、「trackings」/「upstream」、および「current」の間で切り替えることができます。git-configのマニュアルページで「push.default」の設定を参照してください。
それはあなたのために追跡を設定します。これには省略形を使用できます。
git push origin master
コロンの後の部分は、リモートリポジトリのブランチの名前です。省略した場合、gitは同じ名前が必要であると想定します。
お役に立てれば。