Git:ベアリポジトリでアクティブブランチを変更する正しい方法は?


195

プロジェクトの中央ストアとして使用される裸のリポジトリがあります。すべての開発者はそれgit clone <repo>を共有するために行います。クローンを作成すると、が含まれているgit clone -nため、マスターブランチのチェックアウトを取得します(そうでない場合)。これにより、これがアクティブブランチになります。repo.git/HEADref: refs/heads/master

問題は、Active Branchを適切に変更するにはどうすればよいですか?repo.git/HEADファイルを直接ハッキングすることもできますが、それは厄介で、ハッキングされているようです。

git checkout <otherbranch>repo .gitディレクトリで実行しようとしましたが、作業ツリーにいないため失敗しました。

私は試しましたgit update-ref HEAD refs/heads/otherbranchが、refs / heads / masterがrefs / heads / otherbranchと同じになるように更新しただけです(そう、私はそれを自分のプロダクションではなく、ダミーのリポジトリで行いました!)

私が試したところgit update-ref --no-deref HEAD refs/heads/otherbranch、ほとんど問題なく動作しました。HEADファイルを更新しましたが、それが指すコミットのSHA1に設定しましたrefs/heads/otherbranch

私はgitバージョンでテストしています1.7.0.2.msysgit.0

私は、を介してこれを行うには方法はありません推測しているgit pushすべてと雑貨が(!)デフォルトのブランチは少し危険なようで変更することができて、しかし確実にレポでそれを行うには良い方法があります.git直接ハッキングよりもディレクトリHEADファイルが。


IMOあなたは根本的にThe Wrong Thingをここでやろうとしているだけです。デフォルトのブランチをマスター以外にする場合は、そのブランチをマスターにする必要があります。または、2つの異なるリポジトリを使用します。
ニコラスナイト

12
これは根本的にここで間違ったことをしようとしていますか?ベアリポジトリは複数のブランチをサポートしています。私はローカルリポジトリのバックアップとしてベアリポジトリを使用しており、ブランチをミラーリングしています。両方にマスターがあり、両方に開発ブランチがあります。ベアリポジトリの開発ブランチのログを確認したい場合は、ファイルをハッキングする必要があります-ベアリポジトリのサポートに関して、gitはここでは根本的に間違っているようです。
クトゥツ

15
@NicholasKnight IMHOあなたはここで根本的に間違っています。ブランチ名としての「マスター」について特別なことは何もありません。これは単なるデフォルトです。「マスター」は会社にとって意味がないため、維持しているリポジトリにはマスターブランチはありません。リリースを行うたびに、新しいリリース番号で新しいメンテナンスブランチを作成し、それをアクティブブランチとして割り当てます。
Spacemoose 2014年

@NicholasKnightどこから来たのか、私は感謝しているが、これはのは、どのように切り替えるように私に言ったことを最初SO Q / Aであるマスター!ベアクローンを作成したときに機能ブランチに最初のリポジトリがあり、そのベアリポジトリからの後続のクローンはデフォルトでマスターではなくそのブランチに設定されていました。
Warbo

1
うわー-この質問は実行され、実行されます-私のナンバーワンの評判ポイントの得点です!「マスター」についての重要な点は、それが単なる名前であり、組織、チーム、プロジェクト、フェーズなど、意味がない場合は、適切なものを選択して、コラボレーターがレポのクローンを作成するとすぐに切り替えられるようにすることです。あなたがConfiguration Managerとしてあなたがそれらをオンにしたいブランチに。以前はClearCase(bletch!)を使用していたため、選択肢は「main」、「main」、または「main」でした。ゆく。
kbro

回答:


279

リモートのベアリポジトリにアクセスできる場合、この記事は次のことを提案しています。

git symbolic-ref HEAD refs/heads/mybranch

リポジトリのHEADファイルを更新して、次の内容を含めます。

ref: refs/heads/mybranch

に記載されているように git-symbolic-ref


リモートリポジトリにアクセスできない場合は、以前の回答を参照しください。


次のようなコマンドを覚えておいてくださいgit remote set-head

  • リモートリポジトリのデフォルトブランチは変更されません。ローカルリポジトリに保存されて
    いるリモートトラッキングブランチのみが変更されます。refs/remotes/<name>/HEAD

  • HEADそれ自体は変更されません(ここでも)だけなrefs/remotes/<name>/HEADので、が必要になり git symbolic-refます。

したがって、ここでは答えgit remote set-head はありません
git symbolic-ref HEADリモートリポジトリに直接アクセスできる場合。


3
ありがとう!私はリモートのベアリポジトリに直接アクセスできるので、git-symbolic-refが機能します。私は他のスレッドで言及されている共通祖先のないトリックが好きです-間違いなく一番下の引き出し用です。私はこれを何年もの間グーグルで過ごしましたが、以前の答えを見つけることができませんでしたが、「gitリモートヘッドマスター」はgit-remote(1)のすぐ下にある2番目に高いランクのヒットとしてそれを見つけます。奇妙な。探しているものが正確にわからないときに、何かを見つけるのがどれほど難しいかを示しています。
kbro

git symbolic-ref HEAD refs/heads/mybranch私にとってはうまくいきました!ありがとう!;)
vinzenzweber

1
私がこの質問に本当に感謝します。私が誤ってマスターとは別のブランチをチェックアウトしたので、今はそれを修正する必要があったからです。
Jonny Best

これは私にはうまくいきません。奇妙なことに、ベアリポジトリのリモートHEADは正しいブランチを表示するようになりましたが、そこからクローンを作成すると、git STILLによってデフォルトで別のブランチに設定されます!
Magnus

@Magnusそれは新しいページで尋ねるにはそれ自体の良い質問です。
VonC 2014年

3

ブランチを変更するには、使用するブランチへのHEAD参照を変更する必要があります。

最初に、以下を実行して、ベアリポジトリ内のすべての参照をリストします。

$find ref

次に、ブランチのリファレンスを見つけますrefs/heads/<my_branch>。形式は次のようになります。次のステップは、現在の参照を確認することです。次のように入力します

$git symbolic-ref HEAD

現在のブランチがどれであるかがわかっているので、必要に応じてそれを更新します。

$git sumbolic-ref HEAD ref/heads/<my_branch>

タントはそれです。楽しい。


2

アクティブブランチを適切に変更するにはどうすればよいですか?

  • ステータス:repo .gitディレクトリのgit checkoutがfatalを返します:この操作はワークツリーで実行する必要があります

  • ヒント:--work-tree引数を追加するだけです

詳細な例:前提:リモートサーバー上の裸のgit:

〜/ bare_git_repository.gitデタッチされた作業ツリー:/ var / www / myappremote

ローカルサーバー: ブランチバージョン1.7を作成します(その他のブランチ)

gitブランチバージョン1.7

git push origin version.1.7

git bare repoを使用したリモートサーバー:

$ cd〜/ bare_git_repository.git

$ gitブランチ

  • マスター
    バージョン.1.7

述べたように、次のコマンド

git checkout version.1.7

返す

致命的:この操作は作業ツリーで実行する必要があります

次のコマンドを使用する

git --work-tree = / var / www / myappremote checkout version.1.7

アクティブブランチを適切に変更する

$ gitブランチ

主人

  • バージョン1.7

以下で結果を確認してください

ll / var / www / myappremote

それが役に立てば幸い


この非常に単純な解決策が私にとってうまくいきました、ありがとう!注:コマンドを正常に実行するには、空の作業ツリーディレクトリを手動で作成する必要がありました。
ジョエルEsponde

-1

また、ベアリポジトリにアクセスできないgit remote set-head場合は、a を実行すると、

この以前の応答を参照してください


-3

私はまた私達のサーバーに裸のレポを持っており、使用してファイルを正常に取得することができました

git clone //server/repo/directory -b branch_name

マンページには、これは非ベアリポジトリのみを対象としていると記載されていますが、新しいローカルリポジトリに


1
あなたが言っていることは真実ですが、特定のブランチを選択するために-bを使用しているという事実は、私の質問のコンテキストであなたの答えを壊します、それはどのようにDEFAULTブランチを設定するかです。
kbro

-4

適用前と適用後の2つのディレクトリを比較しました

git symbolic-ref HEAD refs/heads/mybranch

そして、repo.git / HEADファイルのみが変更されたようですので、おそらくファイルを「ハッキング」するだけで非常に安全です。


2
Git refファイルを直接編集することで発生する可能性のある微妙な問題があります。私はそれに対して強くお勧めします。配管コマンドは、参照を直接編集するよりも簡単で安全です。
Alain O'Dea

2
この@borynの利点は何ですか?
Alex Chamberlain

2
Gitは、参照の履歴など、バックグラウンドで多くのことを追跡します。ファイルを手動で変更すると、ログに記録されません。それはおそらく問題にならないことは事実です。しかし、いくつかのコミットを追跡できず、それらを見つけたい場合は、ファイルを単に「ハッキング」しなかった方が幸福になります。
qwerty9967 2013

コマンドを使いました。しかし、この回答は、それがどのように機能するかを理解するのに役立ち、特に、refs / headsは内部的なものであり、「パス」の最後の部分のみを変更するべきではないことを理解するのに役立ちました。結局、貴重な情報だったと思い投票しました。
マイクケスキノフ2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.