web-dev-qa-db-ja.com

すべてのGitブランチを取得する方法

私はGitリポジトリをクローンしました。これには5つのブランチがあります。しかし、私がgit branchを実行するとき、私はそれらのうちの1つだけを見ます:

$ git branch
* master

all ブランチを表示するためにgit branch -aを実行できることはわかっていますが、git branchを実行すると次のようになります。

$ git branch
* master
* staging
* etc...
1182
David542

あなたはこのようなすべてのリモートから一つのブランチを取得することができます:

git fetch --all

fetchはリモートブランチのローカルコピーを更新するので、これはあなたのローカルブランチにとっては常に安全です _しかし_

  1. fetch update localの枝( track remoteの枝)を更新しません。あなたがあなたのローカルブランチを更新したいのであれば、あなたはまだすべてのブランチを引っ張る必要があります。

  2. fetch create local branches(これは track remote branches)を作成しません。手動でこれを行う必要があります。すべてのリモートブランチを一覧表示したい場合はgit branch -a

リモートブランチを追跡する update localブランチへ:

git pull --all

ただし、これでもまだ不十分な場合があります。リモートブランチを追跡するローカルブランチに対してのみ機能します。すべてのリモートブランチを追跡するには、このoneliner _を_ git pull --allの前に実行します。

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#Origin/}" "$remote"; done

TL、DRバージョン

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#Origin/}" "$remote"; done
git fetch --all
git pull --all

(pullはすべてのリモートからすべてのブランチを取得するようですが、念のために必ず最初に取得します。)

最初のコマンドは、ローカルブランチで追跡されていないリモートブランチがサーバー上にある場合にのみ実行してください。

P.S AFAIK git fetch --allgit remote updateは同等です。



Kamil Szotの コメント 、74人(少なくとも)の人が役に立ちました。

私は使用しなければなりませんでした:

for remote in `git branch -r`; do git branch --track ${remote#Origin/} $remote; done

あなたのコードがOrigin/branchnameという名前のローカルブランチを作成していて、私が "refname 'Origin/branchname'を参照しているときはいつもあいまいです。

1595
Wookie88

リモートブランチをリストするには:
git branch -r

それらをローカルブランチとしてチェックアウトするには:
git checkout -b LocalName Origin/remotebranchname

607
Learath2

リモートブランチを追跡するローカルブランチを作成する必要があります。

Originという名前のリモートが1つだけあると仮定すると、このスニペットはすべてのリモート追跡用のローカルブランチを作成します。

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##Origin/} $b; done

その後、git fetch --allはリモートブランチのすべてのローカルコピーを更新します。

また、git pull --allはあなたのローカルトラッキングブランチを更新しますが、あなたのローカルコミットと 'merge' configureオプションの設定方法によってはマージコミット、早送りあるいは失敗を引き起こすかもしれません。

175
Michael Renner

もしあなたがそうするなら:

git fetch Origin

それから彼らはすべてローカルにいるでしょう。あなたがその後実行した場合:

git branch -a

あなたはそれらがremotes/Origin/branch-nameとしてリストされているのを見るでしょう。彼らは地元にいるので、あなたは彼らと一緒に好きなことは何でもすることができます。例えば:

git diff Origin/branch-name 

または

git merge Origin/branch-name

または

git checkout -b some-branch Origin/branch-name
106
GoZoner
$ git remote update
$ git pull --all

これはすべてのブランチが追跡されていることを前提としています。

そうでない場合は、Bashでこれを起動できます。

for remote in `git branch -r `; do git branch --track $remote; done

その後、コマンドを実行してください。

56
Johnno Nolan

git fetch && git checkout RemoteBranchNameを使用してください。

それは私にとって非常にうまくいきます...

45
Regis Zaleman

Bashのforループは私にとってはうまくいきませんでしたが、これはまさに私が望んでいたことでした。私のOriginのブランチはすべて同じ名前でローカルにミラーされていました。

git checkout --detach
git fetch Origin '+refs/heads/*:refs/heads/*'

下の Mike DuPont のコメントを参照してください。私はJenkinsサーバでこれをやろうとしていたと思います。

40
Tim Lum

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

$ 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フォルダがあります。

  2. 第二段階

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

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

    現在のフォルダ内にあるものすべてをつかみ、ローカルマシン上にすべてのブランチを作成します。したがって、これは通常のリポジトリになります。

    $ git reset --hard
    

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

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

30
FedericoCapaldo

次のようにしてすべてのブランチを取得することができます。

git fetch --all

または

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

--depth=10000パラメータは、リポジトリを浅くしている場合に役立つかもしれません。


すべての枝を引っ張るには、次のようにします。

git pull --all

上記の方法でうまくいかない場合は、上記のコマンドの前に次のように入力します。

git config remote.Origin.fetch '+refs/heads/*:refs/remotes/Origin/*'

remote.Origin.fetchはフェッチ中に特定のブランチのみをサポートする可能性があるため、特に--single-branchを使用してリポジトリを複製した場合は特にそうです。これをチェックしてください:git config remote.Origin.fetch

その後、あなたはどんなブランチでもチェックアウトできるはずです。

また見なさい:


すべてのブランチをリモートにプッシュするには、次のようにします。

git Push --all

最終的に--mirrorはすべての参照を反映します。


あなたの目的がリポジトリを複製することであるなら、GitHubの リポジトリの複製 の記事を見てください。

24
kenorb

私は通常、このようなコマンド以外は何も使用しません。

git fetch Origin
git checkout --track Origin/remote-branch

もう少し短いバージョン:

git fetch Origin
git checkout -t Origin/remote-branch
24
marioosh

私はあなたがリポジトリをクローンしたと信じています:

git clone https://github.com/pathOfrepository

それではcdを使ってそのフォルダに行ってください。

cd pathOfrepository

git statusと入力すると、allと表示されます。

   On branch master
Your branch is up-to-date with 'Origin/master'.
nothing to commit, working directory clean

すべての隠しブランチタイプを見るには:

 git branch -a

すべてのリモートブランチが一覧表示されます。

特定のブランチでチェックアウトしたい場合は、次のように入力してください。

git checkout -b localBranchName Origin/RemteBranchName
14

すべてのブランチを取得してからすべてを別のGitサーバーに移行するためのソリューションを探しているのであれば、以下のプロセスをまとめます。すべてのブランチをローカルに更新したいだけの場合は、最初の空行で止めます。

git clone <ORIGINAL_Origin>
git branch -r | awk -F'Origin/' '!/HEAD|master/{print $2 " " $1"Origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --Prune --tags
git pull --all

git remote set-url Origin <NEW_Origin>
git pull
<resolve_any_merge_conflicts>
git Push --all
git Push --tags
<check_NEW_Origin_to_ensure_it_matches_ORIGINAL_Origin>
14
ingyhere

マスターリポジトリをクローンした後は、ただ実行することができます。

git fetch && git checkout <branchname>
12
Davidacce

ループは私にはうまくいかないようで、Origin/masterを無視したいと思いました。これは私のために働いたものです。

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

その後:

git fetch --all
git pull --all
9
poxion

すべてのリモートブランチが.git/configファイルで取得可能であることを確認してください。

この例では、Origin/productionブランチのみがフェッチ可能です。たとえgit fetch --allを実行しようとしても、productionブランチをフェッチするだけで、何も起こりません。

[Origin]
fetch = +refs/heads/production:refs/remotes/Origin/production

この行は次のように置き換えられます。

[Origin]
fetch = +refs/heads/*:refs/remotes/Origin/*

それからgit fetch etc ...を実行してください。

9
Ahmad

これら3つのコマンドだけですべての分岐が得られます。

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard
7

私は新しいリポジトリのクローンを作成し、すべてのリモートブランチ用にローカルブランチを作ることを管理するための小さなスクリプトを書きました。

最新版を見つけることができます ここ

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | Perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

それを使うには、それをあなたのgit binディレクトリにコピーしてください(私にとってはC:\Program Files (x86)\Git\bin\git-cloneallです)。それからコマンドラインで:

git cloneall [standard-clone-options] <url>

通常どおりクローンを作成しますが、すべてのリモートブランチ用にローカルトラッキングブランチを作成します。

4
tstone2077

これは私が頑強だと思うものです:

  • 既存のブランチのリモートトラッキングを更新しません
  • Origin/HEADを追跡するようにHEADを更新しようとしない
  • Origin以外の名前のリモートを許可します
  • 適切に引用符で囲まれたシェル
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

git fetch --all-allに渡すとこのオプションが内部のfetchに渡されるので、git pullは必要ありません。

この答えに - のクレジット。

3
Tom Hale

これが、受け入れられた答えで提供されているワンライナーのPerl版です。

git branch -r | Perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /Origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

必要に応じて、出力ファイルをシェルスクリプトとして実行できます。

Stashプロジェクトリポジトリを誤って削除しました。幸い、誰かが偶然の損失の直前にフォークを作りました。私は自分の地元にフォークをクローンした(私がそうした方法の詳細は省略する)。フォークを地元で完全に手に入れたら、ワンライナーを走らせました。リモートのURL(私の場合はOrigin)を修正して、復旧先のターゲットリポジトリを指すようにしました。

git remote set-url Origin <remote-url>

そしてようやくすべてのブランチをOriginにプッシュしました。

git Push --all Origin

そして私達はビジネスに戻った。

2
Jose Quijada

PowerShellを使用しているWindowsユーザーの場合:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all
2
kiewic

ブランチやタグの名前をすべて一時ファイルに入れてから、それぞれの名前/タグに対してgit pullを実行します。

git branch -r | grep Origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull Origin $tag_or_branch; done
1
anhlc

'fatal:' Origin/master 'という名前のブランチが既に存在しています'というエラーメッセージを回避するには、これが必要です。

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#Origin/}" "$remote"; done
1
HaxtraZ

fetch --allに関して問題がある場合は、リモートブランチを追跡してください。

git checkout --track Origin/%branchname%
1

シングルリモートを追跡するすべてのGitブランチを取得する方法。

これはWindows 10上のRed HatおよびGit Bashでテストされ機能しています。


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

説明:

一方のライナーはチェックアウトしてから、HEAD以外のすべてのブランチを取り出します。

リモートトラッキングブランチを一覧表示します。

git branch -r

HEADを無視してください。

grep -v ' -> '

支店名をリモコンから外します。

cut -d"/" -f2

単一のリモコンを追跡するすべてのブランチをチェックアウトしてください。

git checkout $branch

チェックアウトしたブランチを取得します。

git fetch

技術的には、フェッチは新しいローカルブランチには必要ありません。

これはfetchpullの両方のブランチで、どちらも新しくてリモートに変更がある場合に使用できます。

マージする準備ができている場合にのみプルするようにしてください。


テスト設定

SSH URLでリポジトリをチェックしてください。

git clone [email protected]

ローカルで枝をチェックしてください。

$ git branch
* master

コマンド実行

ワンライナーを実行します。

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

あと

ローカルブランチにリモートブランチが含まれていることを確認してください。

$ git branch
  cicd
  master
* preprod
0
Greg Weigner

Visual Studioユーザーの場合、Package Managerコンソールで次の操作を行います。

gitブランチ| %{上流へのgitフェッチ。 git merge upstream/master}

0
Jose Ortega

Learath2の答えに基づいて、作成したディレクトリにgit clone [...]cdを入れた後に私がしたことがあります。

git branch -r | grep -v master | awk {print\$1} | sed 's/^Origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

私のために働いたが、私はそれがあなたのために働くことを知りません。注意してください。

0
erikano

多くの方法を試してみましたが、これはシンプルで私にとってはうまくいきます。

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done
0
PageNotFound
git remote add Origin https://yourBitbucketLink

git fetch Origin

git checkout -b yourNewLocalBranchName Origin/requiredRemoteBranch (use tab :D)

今ローカルであなたのyourNewLocalBranchNameはあなたのrequiredRemoteBranchです。

0
chhotu sardar