Git ですべてのリモート ブランチのクローンを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/67699

質問

私は持っています master そして development ブランチ、両方ともプッシュ GitHub. 。私は cloned、 pull編、そして fetch編ですが、私は依然として、 master 分岐して戻ります。

明らかな何かが欠けていると確信していますが、マニュアルを読んでもまったく満足できませんでした。

役に立ちましたか?

解決

まず、リモートのクローンを作成します ギット リポジトリと CD その中に:

$ git clone git://example.com/myproject
$ cd myproject

次に、リポジトリ内のローカル ブランチを確認します。

$ git branch
* master

しかし、リポジトリには他のブランチが隠れています。これらは、 -a フラグ:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

上流のブランチをちょっと覗いてみたいだけの場合は、直接チェックアウトできます。

$ git checkout origin/experimental

ただし、そのブランチで作業したい場合は、ローカル追跡ブランチを作成する必要があります。これは次のように自動的に行われます。

$ git checkout experimental

そしてあなたは見るでしょう

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

この最後の行を聞いて、次のような疑問を抱く人もいるでしょう。「新しい支店」――あれ?これが実際に意味するのは、ブランチがインデックスから取得され、ローカルに作成されるということです。の 前の この行は、ブランチがリモート ブランチ (通常はorigin/branch_name ブランチを意味します) を追跡するように設定されていることを示しているため、実際にはより有益です。

ここで、ローカル ブランチを見ると、次のようになります。

$ git branch
* experimental
  master

実際には、次を使用して複数のリモート リポジトリを追跡できます。 git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

この時点で、事態はかなりおかしくなっているので、逃げてください gitk 何が起こっているかを確認するには:

$ gitk --all &

他のヒント

一度にフェッチしたいリモート ブランチが多数ある場合は、次のようにします。

$ git pull --all

これで、リモート リポジトリにアクセスせずに、必要に応じてブランチをチェックアウトできるようになりました。

これ バッシュ スクリプトが役に立ちました:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

これにより、master (おそらく元の clone コマンドから取得した) を除くすべてのリモート ブランチの追跡ブランチが作成されます。まだ行う必要があるかもしれないと思います

git fetch --all
git pull --all

念のため。

一発ギャグ: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs いつものように:私たちが知っているように、rm -rfユニバースをコピーする前にセットアップでテストしてください

ワンライナーのクレジットはユーザー cfi に与えられます

の使用 --mirror オプションはコピーするようです remote ブランチを適切に追跡します。ただし、リポジトリはベア リポジトリとして設定されるため、後で通常のリポジトリに戻す必要があります。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

参照: Git に関するよくある質問:リモートで追跡されるすべてのブランチを含むリポジトリのクローンを作成するにはどうすればよいですか?

「git checkout -b somebranchorigin/somebranch」という複雑な構文を使用しなくても、ブランチに簡単に切り替えることができます。次のようにするだけです。

git checkout somebranch

Git は自動的に適切な処理を実行します。

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git は、同じ名前のブランチが 1 つのリモートに存在するかどうかを確認し、存在する場合は、それがリモート ブランチであることを明示的に指定した場合と同じ方法で追跡します。Git 1.8.2.1 の git-checkout マニュアル ページから:

もしu003Cbranch>見つかりませんが、正確に1つのリモコンに追跡ブランチが存在します(呼び出しますu003Cremote>)一致する名前で、に相当するものとして扱います

$ git checkout -b <branch> --track <remote>/<branch>

に関して、

$ git checkout -b 実験的な起源/実験的な

を使用して

$ git checkout -t origin/experimental

または、より冗長ですが覚えやすいです

$ git checkout --track origin/experimental

リモートリポジトリを追跡するという点では、その方が良いかもしれません。

実行しているフェッチではすべてのリモート ブランチを取得する必要がありますが、それらのローカル ブランチは作成されません。gitk を使用している場合は、「remotes/origin/dev」またはそれに類似したものとして記述されたリモート ブランチが表示されるはずです。

リモート ブランチに基づいてローカル ブランチを作成するには、次のような操作を行います。

git checkout -b dev refs/remotes/origin/dev

これは次のようなものを返すはずです:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

dev ブランチにいるとき、「git pull」はローカル dev をリモート dev ブランチと同じポイントに更新します。すべてのブランチをフェッチしますが、ツリーの最上部にあるブランチのみをプルすることに注意してください。

「git clone git://location」を実行すると、すべてのブランチとタグが取得されます。

特定のリモート ブランチ上で作業するには、それが元のリモートであると仮定して、次のようにします。

git checkout -b branch origin/branchname

エイリアスを使用します。ネイティブの Git ワンライナーはありませんが、独自のワンライナーを次のように定義できます。

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

そしてそれを次のように使用します

git clone-branches

なぜ「マスター」だけが表示されるのか

git clone ファイルが新しいリポジトリに配置されている場合でも、すべてのリモート リモート ブランチをダウンロードしますが、依然として「リモート」とみなされます。これには例外が 1 つあります。それは、クローン作成プロセスによって、「master」と呼ばれるリモート ブランチから「master」と呼ばれるローカル ブランチが作成されることです。デフォルトでは、 git branch ローカル ブランチのみが表示されるため、「マスター」のみが表示されます。

git branch -a すべてのブランチを表示します。 リモートブランチを含む.


ローカルブランチを取得する方法

実際にブランチで作業したい場合は、おそらくそのブランチの「ローカル」バージョンが必要になります。リモート ブランチからローカル ブランチを簡単に作成するには (チェックアウトせずに作業ディレクトリの内容を変更します), 、次のようにすることができます。

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

この例では、 branchone に基づいて作成するローカル ブランチの名前です origin/branchone;代わりに、別の名前でローカル ブランチを作成したい場合は、次のようにすることができます。

git branch localbranchname origin/branchone

ローカル ブランチを作成したら、次のコマンドで確認できます。 git branch (覚えておいてください、必要ありません -a ローカル支店を参照してください)。

これはそれほど複雑ではなく、非常にシンプルで簡単な手順は次のとおりです。

git fetch origin これにより、すべてのリモート ブランチがローカルに移動します。

git branch -a これにより、すべてのリモート ブランチが表示されます。

git checkout --track origin/<branch you want to checkout>

次のコマンドを使用して、目的のブランチにいるかどうかを確認します。

git branch

出力は次のようになります。

*your current branch 
some branch2
some branch3 

現在のブランチを示す * 記号に注目してください。

遅刻しないよりはマシですが、これを行うための最良の方法は次のとおりです。

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

この時点で、リモート リポジトリのすべてのブランチを含む完全なコピーが作成されました (次のコマンドで確認します)。 git branch)。使用できます --mirror の代わりに --bare リモート リポジトリに独自のリモートがある場合。

これを実行してください:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

「git clone git://example.com/myprojectt」はブランチも含めてすべてをフェッチします。チェックアウトするだけで、ローカル ブランチが作成されます。

すべてのブランチを取得するには、「git clone」を使用するだけです。

git clone <your_http_url>

master ブランチのみが表示されている場合でも、「git Branch -a」を使用するとすべてのブランチを表示できます。

git branch -a

すでに持っているブランチに切り替えることもできます。

git checkout <your_branch_name>

「git clone」を実行した後は、リモート リポジトリに接続する必要はありません。Wi-Fi を閉じても「git Branch -a」と「git checkout」は正常に実行できますので、心配する必要はありません。したがって、「git clone」を実行すると、すでにリモート リポジトリからすべてのブランチがコピーされていることがわかります。その後、リモート リポジトリは必要なくなります。ローカルにはすべてのブランチのコードがすでに存在します。

git clone リポジトリ全体をコピーすることになっています。クローンを作成してから実行してみてください git branch -a. 。すべてのブランチがリストされるはずです。「master」ではなくブランチ「foo」に切り替えたい場合は、次を使用します。 git checkout foo.

私のツールを使用してください git_remote_branch (マシンに Ruby がインストールされている必要があります)。これは、リモート ブランチ操作を非常に簡単にするために特別に構築されています。

ユーザーに代わって操作を実行するたびに、コンソールに赤色で表示されます。時間が経つにつれて、それらは最終的にあなたの脳に残ります:-)

grb に代わりにコマンドを実行させたくない場合は、「explain」機能を使用してください。コマンドは実行されるのではなく、コンソールに出力されます。

最後に、覚えやすくするために、すべてのコマンドにはエイリアスがあります。

これは、 アルファ版ソフトウェア ;-)

grb help を実行すると、次のようなヘルプが表示されます。

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch

ここで見た答えはすべて有効ですが、リポジトリをクローンしてすべてのブランチを一度にプルする、よりクリーンな方法があります。

リポジトリのクローンを作成すると、実際にはブランチのすべての情報がダウンロードされますが、ブランチは非表示になります。コマンドで

$ git branch -a

リポジトリのすべてのブランチを表示するには、次のコマンドを使用します。

$ git checkout -b branchname origin/branchname

その後、一度に 1 つずつ手動で「ダウンロード」できます。


ただし、多数のブランチを含むリポジトリのクローンを作成する場合、上で説明したすべての方法は長くて退屈ですが、これから説明する、少し複雑ではありますが、よりクリーンで迅速な方法と比べると、長くて退屈です。これを実現するには、次の 3 つの手順が必要です。

  1. 最初の一歩

マシン上に新しい空のフォルダーを作成し、リポジトリから .git フォルダーのミラー コピーを複製します。

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

my_repo_folder フォルダー内のローカル リポジトリはまだ空で、ターミナルから "ls -alt" コマンドで表示できる非表示の .git フォルダーがあるだけです。

  1. 第二段階

git 設定のブール値「bare」を false に切り替えることで、このリポジトリを空の (ベア) リポジトリから通常のリポジトリに切り替えます。

$ git config --bool core.bare false
  1. 第三段階

現在のフォルダー内のすべてを取得し、ローカル マシン上にすべてのブランチを作成することで、これを通常のリポジトリにします。

$ git reset --hard

これで、「git Branch」コマンドを入力するだけで、すべてのブランチがダウンロードされたことがわかります。

これは、すべてのブランチを含む git リポジトリのクローンを一度に作成できる簡単な方法ですが、すべてのプロジェクトに対してこの方法で実行したいわけではありません。

質問に対する回答の 1 つを見て、それを短縮できることに気付きました。

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

ただし、リモート ブランチの 1 つが、たとえば「」という名前になっている場合は注意してください。admin_master ダウンロードされません!

オリジナルのアイデアを提供してくれた bigfish に感謝します

ローカル リポジトリからのクローン作成は、git clone および git fetch では機能しません。多くのブランチ/タグがフェッチされないままになります。

すべてのブランチとタグを含むクローンを取得します。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

すべてのブランチとタグだけでなく、作業コピーも含むクローンを取得するには、次のようにします。

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

わかりました、 リポジトリのクローンを作成すると、そこにすべてのブランチが存在します...

ただやれば git branch, 、それらは一種の隠されたものです...

したがって、すべてのブランチ名を表示したい場合は、単に追加するだけです --all このようなフラグを立てます:

git branch --all または git branch -a

支店にチェックアウトするだけで、必要なものがすべて手に入ります。

しかし、クローンを作成した後に他の人が作成したブランチの場合はどうなるでしょうか?

この場合は、次のようにしてください。

git fetch

そしてすべてのブランチをもう一度確認してください...

フェッチとチェックアウトを同時に行いたい場合は、次のようにすることができます。

git fetch && git checkout your_branch_name

また、私が言ったことを簡単にするために、以下の画像も作成しました。

git branch --all to get all branches

#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

これらのコードは、すべてのリモート ブランチ コードをローカル リポジトリにプルします。

コマンドラインにコピーアンドペーストする場合:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

さらに読みやすくするには:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


この意志:

  1. マスターをチェックアウトします (現在いるブランチを削除できるようにするため)
  2. リモートを選択 チェックアウトする (お持ちのリモコンに変更してください)
  3. すべてのブランチをループします マスターとHEADを除くリモートの
    1. 消去 ローカル ブランチ (強制的に更新されたブランチをチェックできるように)
    2. チェックアウト リモートからの分岐
  4. マスターをチェックアウトしてください(念のため)

に基づく 答えボンC.

まったく同じことをする必要がありました。これが私のものです ルビー 脚本。

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

これ小さく書きました パワーシェル オリジンリモート上にあるすべての git ブランチをチェックアウトできるようにする機能です。

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

その他の git 関数は次の場所にあります。 私の git 設定リポジトリ

Git は通常 (指定されていない場合)、すべてのブランチおよび/またはタグ (refs、参照: git ls-refs) 1 つ以上の他のリポジトリから、その履歴を完了するために必要なオブジェクトとともに保存されます。言い換えれば、すでにダウンロードされているオブジェクトによって到達可能なオブジェクトをフェッチします。見る: どういうことですか git fetch 本当にそうなの?

場合によっては、現在のブランチ/タグに直接接続されていないブランチ/タグがある場合があります。 git pull --all/git fetch --all この場合は役に立ちませんが、次のようにリストすることができます。

git ls-remote -h -t origin

参照名を知って手動でフェッチします。

する 全部取ってきて, 、 試す:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000 リポジトリを浅くした場合は、パラメータが役立つ場合があります。

次に、すべてのブランチを再度確認します。

git branch -avv

上記で解決しない場合は、不足しているブランチを追跡リストに手動で追加する必要があります (何らかの理由でブランチが失われたため)。

$ git remote -v show origin
...
  Remote branches:
    master      tracked

による git remote set-branches のように:

git remote set-branches --add origin missing_branch

したがって、以下に表示される可能性があります remotes/origin フェッチ後:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

トラブルシューティング

それでも master ブランチ以外を取得できない場合は、以下を確認してください。

  • リモコンを再確認してください (git remote -v)、例:
    • それを検証してください git config branch.master.remoteorigin.
    • どうかを確認してください origin 以下を介して正しい URL を指します。 git remote show origin (これを参照してください 役職).

ユーザー誰も正しい道を進んでいないことを除いて、これらの答えはどれも解決しません。

あるサーバー/システムから別のサーバー/システムにリポジトリを移動するときに問題が発生しました。リポジトリを複製すると、マスターのローカル ブランチのみが作成されたため、新しいリモートにプッシュすると、マスター ブランチのみがプッシュされました。

したがって、これら 2 つの方法が非常に便利であることがわかりました。彼らが他の誰かを助けることを願っています。

方法 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

方法 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

覚えやすいコマンドを使用する

Atlassian のリポジトリ ホスティング サービスである Bitbucket を使用しています。そこで私は彼らのドキュメントに従おうとします。そしてそれは私にとって完璧に機能します。次の簡単で短いコマンドを使用して、リモート ブランチをチェックアウトできます。

まずリポジトリのクローンを作成し、次に宛先フォルダーに変更します。そして最後に重要なことをフェッチしてチェックアウトします。

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

それでおしまい。ここではもう少し現実的な例を示します。

git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

コマンドの詳細については、ドキュメントを参照してください。クローンコマンド, フェッチコマンド, チェックアウトコマンド

2017 年初頭の時点での答えは、 このコメントで 作品:

git fetch <origin-name> <branch-name> ブランチをダウンさせます。これはすべてのブランチを一度にプルするわけではありませんが、これをブランチごとに個別に実行できます。

これは、すべてのリモートブランチのローカルブランチを作成する別の短い1ライナーコマンドです。

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

追跡ローカル ブランチがすでに作成されている場合にも、正しく動作します。最初の後に呼び出すことができます git clone または後でいつでも。

必要がない場合は、 master クローン作成後にブランチをチェックアウトしました。使用してください

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout

git clone --mirror 元のリポジトリではこれに適しています。

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top