Gitリモートヘッドを変更して、マスター以外のものを指すようにする


124

GitリモートのHEADリファレンスを「マスター」以外のものを指すように設定するにはどうすればよいですか?

私のプロジェクトには、「マスター」ブランチを使用しないというポリシーがあります(すべてのブランチには意味のある名前を付ける必要があります)。さらに、正規のマスターリポジトリにはssh://経由でのみアクセスでき、シェルアクセス(GitHubやUnfuddleなど)はありません。

私の問題は、リモートリポジトリにまだrefs / heads / masterへのHEAD参照があることですが、別のブランチをポイントする必要があります。これにより2つの問題が発生します。

  1. レポを複製すると、これが

    警告:リモートHEADは存在しない参照を参照しているため、チェックアウトできません。

    それは混乱して不便です。

  2. Webベースのコードブラウザーは、ツリーを参照するための基礎としてHEADに依存しています。次に、有効なブランチを指すHEADが必要です。


レコードの可能性を1つ追加しただけで、ケースには適していません。
VonC 2009

「共通祖先なし」のトリック:興味深い。詳細な回答として投稿し、問題がなければ、公式回答として選択できます。
VonC 2009

12
FWIW、質問でGitHubについて触れたため、GitHubのHEAD refを変更する場合は、リポジトリの[管理]画面に移動し、[デフォルトのブランチ]ドロップダウンを、HEADが指す任意のブランチに変更します。
Joe


回答:


63

1年前にGitHubでほぼ同じ質問がありました。

アイデアはマスターブランチの名前を変更することでした:

git branch -m master development
git branch -m published master
git push -f origin master 

マスターを作ることはあなたが人々に使ってもらいたいことを持ち、ブランチで他のすべての仕事をすることです。

( " git-symbolic-ref HEAD refs/head/published"はリモートリポジトリに反映されません)

これは、「Gitでorigin / masterを削除するにはどうすればよいですか」に似ています。


このスレッドで言ったように:(私の強調)

" git clone"は単一のローカルブランチのみを作成します。
これを行うにHEAD refは、リモートリポジトリのを調べ、それが参照するリモートブランチと同じ名前のローカルブランチを作成します。

まとめると、リポジトリAがあり、それを複製します。

  • HEAD参照refs/heads/masterと存在
    -> origin / masterから始まるmasterというローカルブランチを取得します

  • HEAD参照refs/heads/anotherBranchとそれが存在する
    ->という名前のローカルブランチanotherBranchorigin/anotherBranch

  • HEAD参照refs/heads/masterとそれが存在しない
    -> "git clone"が文句を言う

HEADリポジトリ内の参照を直接変更する方法があるかどうかはわかりません

(あなたの質問のすべてのポイントです、私は知っています;))


たぶん唯一の方法は、「貧しい人々のための出版物」になるでしょう。

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

ただし、これにはサーバーへの書き込みアクセスが含まれますが、これは常に可能とは限りません。


Git:ベアリポジトリでアクティブブランチを変更する正しい方法は?」で説明したようgit remote set-headに、リモートリポジトリでは何も変更しません。

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


ありがとう、VonC。ここに投稿する前にそれを読みました。しかし、ご覧のとおり、「マスター」と呼ばれるブランチは、技術的およびポリシー上の理由から、このプロジェクトでは歓迎されません。
JasonSmith

次に、pre-commitフックを介してマスターブランチの更新を禁止することにより、そのポリシーを適用できます。
VonC 2009

はい、私が望むことをする方法がないことが判明した場合、私はそれを正確に行い、あなたの答えを受け入れます。フォローアップありがとうございます!
JasonSmith

更新していただきありがとうございます。現時点では、「no-common-ancestor」トリックを使用して、1つのコミットのみでマスターブランチを作成しました。(つまり、git branch -D master; echo ref:refs / heads / master> .git / HEAD; rm *)。次に、GO_AWAYというファイルに触れただけで、コミットメッセージで状況が説明されます。それは今のところうまくいくでしょう。ソースをチェックして、受信側が最終的な回答のためにHEADを設定する場所を追跡できます。
JasonSmith

1
@ctnこれは単に-f--force)オプションを忘れたためです。私はそれに応じて答えを編集しました。次に、あなたが参照する答えは同じオプションを使用します。
VonC、2015年

42

更新:これは、リポジトリのローカルコピー(「クライアント」)に対してのみ機能します。以下のコメントをご覧ください。

最近のバージョンのgit(2014年2月)では、正しい手順は次のようになります。

git remote set-head $REMOTE_NAME $BRANCH

たとえば、リモートのヘッドoriginをブランチに切り替えると、次のdevelopようになります。

git remote set-head origin develop


この機能はサーバーに最新バージョンのgitを必要としますか、それともクライアントマシンに最新のgitがインストールされている場合はそれで十分ですか?
ミッコランタライネン2014年

3
@Totorは簡潔ですが正しいです。この回答は反対票です。Gitには、「リモートのローカルのデフォルトブランチ」という、やや混乱する概念があります。「origin / defaultbranch」の代わりに「origin」と入力でき、純粋なクライアント側の機能です。で長い話git-scm.com/docs/git-remote#セット-ヘッド
三月

1
@MarchHが何について話しているかを確認するには、runを実行しgit checkout -b default; git push origin HEAD; git remote set-head origin defaultます。次に、ローカルの変更を検査できますcat .git/refs/remotes/origin/HEAD(それはである必要がありますref: refs/remotes/origin/default)。リモートの変更がないことを検査できますgit remote show origin(デフォルトのブランチを追加する前の状態のままです)。
デ・ノボ

37

あなたがGitHubについて言及しているので、彼らのサイトでそれを行うには、単にあなたのプロジェクトに入ります...

admin > Default Branch > (choose something)

できました。


1
優れた!それが最後の欠けているビットでした。
バーカス

私のオリジン/ HEADは、マスターではなく機能ブランチをすでにポイントしています。「メインブランチ」を前後に変更してみましたが、HEADには影響しませんでした...何か提案はありますか?
Daniil Shevelev、2014年

3
設定>ブランチ>デフォルトブランチ
Chun Yang

12

参照:http : //www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

これにより、gitリポジトリにデフォルトのブランチが設定されます。これは、ベアリポジトリまたはミラーリポジトリで実行できます。

使用法:

$ git symbolic-ref HEAD refs/heads/<branch name>

6
$ git symbolic-ref HEAD refs / heads / name-of-branch
Lamy

私はこれをリモートリポジトリで行い、何らかの理由でヘッドが別のブランチ名であったためにマスターをクローンしようとすると、Composerでマスターを閉じようとしたときにエラーが発生するという問題を修正しました。これは、このシナリオに非常に特有である可能性があります、しかし他の人たちはその立場にあり、何をすべきか疑問に思うかもしれません
クリストファー・トーマス

10

(すでに基本的に同じ質問「リモートリポジトリにgitシンボリック参照を作成する」がありましたが、普遍的な回答はありませんでした。)

:(:httpとssh経由で複数のユーザーが制限されたインターフェイスを介してのgitリポジトリを管理することができる)。しかし、様々なgitの「農場」のための具体的な答えがありますhttp://Github.comhttp://Gitorious.orgのhttp:/ /repo.or.czGirarhttp://git.altlinux.org)。

これらの具体的な回答は、このページを読んでこれらの具体的なサービスについて考える人にとって役立つかもしれません。


4
これで、repo.or.cz(例:repo.or.cz/editproj.cgi?name =for- me-and -for- all_imz.git)およびgitorious.orgに HEADブランチを選択するためのドロップダウンメニューが表示されます。も。すごい!
imz-Ivan Zakharyaschev、2011年

7

シェルからリモートリポジトリにアクセスできる場合は、.git(またはベアリポジトリの場合はメインディレクトリ)に移動し、HEADファイルを正しいヘッドを指すように変更します。たとえば、デフォルトでは常に「refs:refs / heads / master」が含まれますが、代わりにfooをHEADにする必要がある場合は、HEADファイルを編集して内容を「refs:refs / heads / foo」に変更します。


私はGitサーバーの管理者権限を持っていますが、まったく同じです。私たちはGitoliteを使用して、私が作成したリポジトリに行きました。ディレクトリ名はmyrepo.gitです。指定されたディレクトリのHEADファイルの内容がからに変更されref: refs/heads/masterましたref: refs/heads/mainline。ここで、ローカルボックスのリポジトリを複製しようとすると、まだマスターを指しています。git clone ssh://gitolite@git.server/myrepoコマンドを実行しました。そのような行動のアイデアはありますか?
Technext 2015年

Gitサーバーバージョン:git version 1.7.1&Gitクライアントバージョン:git version 1.9.4.msysgit.2
Technext

5

磁器のGitコマンドのみを使用して、切り離されたマスターブランチを作成できます。

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

これにより、失礼なメッセージを含むマスターブランチが得られます(より丁寧になりたい場合があります)。次に、「実際の」ブランチを作成し(SVNを考慮してトランクと呼びましょう)、masterから離婚します。

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

ねえ、プレスト! gitk --allは、マスタートランクをリンクなしで表示します。

ここでの「魔法」とは、-amendによってgit commitが現在のHEADと同じ親を持つ新しいコミットを作成し、HEADがそれを指すようにすることです。ただし、現在のHEADはリポジトリの最初のコミットであるため、親はありません。したがって、新しいHEADも親を取得せず、お互いに切り離されます。

refs / heads / masterがまだ指しているため、古いHEADコミットはgit-gcによって削除されません。

--allow-空我々は空の木をコミットしているので、フラグは必要とされています。git rmの後にgit addがあった場合、それは必要ありません。

実際には、リポジトリ内の最初のコミットにブランチし、そのツリーを削除し、分離されたツリーを追加してから、git commit --amendを実行することで、いつでも分離ブランチを作成できます。

これはリモートリポジトリのデフォルトブランチを変更する方法の質問には答えませんが、分離されたブランチを作成する方法については明確な答えを提供します。


1
別のリポジトリから無関係なブランチをフェッチして名前を付けることで、分離されたブランチを簡単に作成できます。たとえば、git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEADはremoteのブランチdetached-branchと一致する新しいブランチを追加します。もちろん、「リモート」は、以前に準備したローカルファイルシステムのリポジトリにすることもできます。remote-branch-namegit:user@example.com:foo
ミッコランタライネン2013年

2

最初に、デフォルトとして設定する新しいブランチを作成します。次に例を示します。

$>git branch main

次に、そのブランチをオリジンにプッシュします。

$>git push origin main

GitHubアカウントにログインすると、リポジトリに移動して[設定]> [デフォルトのブランチ]を選択し、「 main

次に、必要に応じて、masterブランチを削除できます。

$>git push origin :master


理解すべき重要な点は、ホスティングプロバイダー(この例ではGitHub)がデフォルトのブランチを変更する方法を提供しない場合、運が悪いということです。Gitプロトコルには、リモートのデフォルトブランチを変更する機能はありません。git symbolic-refリモートシェルで実行できるかHEAD、リモートリポジトリのルートディレクトリで呼び出されるテキストファイルを変更できる必要があります。
Mikko Rantalainen 2013年

2

質問に関連して、私は検索するとここに行きました:

ローカルリポジトリにGitHubの変更されたデフォルトブランチを認識させる方法

完全を期すため、答えを追加します。

git remote set-head origin -a

0

gitoliteの人々のために、gitoliteは-それを待つ-というコマンドをサポートしていsymbolic-refます。リポジトリへのW(書き込み)権限がある場合、リモートでそのコマンドを実行できます。


-1

単純にGitHubアカウントにログインし、ナビゲーションメニューの右端にある[設定 ]を選択し、[設定]タブで[ デフォルトのブランチ]を選択して、私のために行ったリポジトリのメインページに戻ります。


1
GitHubインターフェースではデフォルトとして新しいブランチが表示されますが、git clone [レポ]を実行すると、そのブランチが取得されません。つまり、.git / HEADに間違った参照が含まれています。
ジョセフシーディ2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.