web-dev-qa-db-ja.com

GitリモートHEADを変更して、master以外の何かを指すようにします

GitリモートのHEAD参照を「マスター」以外の何かを指すように設定するにはどうすればよいですか?

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

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

  1. レポのクローンを作成するとき、これ、

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

    それは混乱を招き、不便です。

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

117
JasonSmith

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

アイデアは、masterブランチの名前を変更することでした:

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」は、1つのローカルブランチのみを作成します。
そのために、リモートリポジトリのHEAD refを調べ、それが参照するリモートブランチと同じ名前のローカルブランチを作成します。

それをまとめるために、リポジトリAを作成してクローンを作成します。

  • HEADrefs/heads/masterを参照し、それが存在します
    -> Origin/masterから始まるmasterというローカルブランチを取得します。

  • HEADがrefs/heads/anotherBranchを参照し、それが存在する
    -> Origin/anotherBranchから始まるanotherBranchというローカルブランチを取得します。

  • HEADはrefs/heads/masterを参照しますが、それは存在しません
    -> "git clone"からの不満

repoHEAD refを直接変更する方法があるかどうかはわかりません。

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


たぶん唯一の方法は 「貧しい人々のための出版物」 です。ここで:

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

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


Git:裸のリポジトリでActive Branchを変更する正しい方法? 」で説明したように、 git remote set-head はリモートリポジトリの何も変更しません。

ローカルリポジトリのremotes/<name>/HEADにローカルに保存されているリモート追跡ブランチのみを変更します。

61
VonC

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

Gitの最新バージョン(2014年2月)では、正しい手順は次のとおりです。

git remote set-head $REMOTE_NAME $BRANCH

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

git remote set-head Origin develop

40
jrhorn424

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

admin > Default Branch > (choose something)

できた.

34
srcspider

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

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

使用法:

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

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

7
squeegee

Porcelain Gitコマンドのみを使用して、デタッチされたmasterブランチを作成できます。

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

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

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

ねえ、プレスト! gitk --allは、masterおよびtrunkを表示します。

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

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

-allow-emptyフラグは、空のツリーをコミットするためにのみ必要です。 git rmの後にgit addがあった場合、それは不要です。

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

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

5
kbro

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

$>git branch main

次に、そのブランチを 原点

$>git Push Origin main

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

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

$>git Push Origin :master

2
4mnes7y

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

0
sitaram