私はmaster
とdevelopment
のブランチを持っていて、どちらも GitHub にプッシュしています。私はclone
d、pull
ed、およびfetch
edを持っていますが、master
ブランチ以外のものを取り戻すことはできません。
明白なことが足りないと確信していますが、マニュアルを読んだことがあり、まったく喜びがありません。
まず、リモートの Git リポジトリと 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'
その最後の行に何人かの人々が投げかけられます: "New branch" - そうですか?本当に意味があるのは、ブランチがインデックスから取り出され、ローカルに作成されるということです。 previous 行は、ブランチがリモートブランチを追跡するように設定されていることを示しているので実際にはより有益です。これは通常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
これで、リモートリポジトリにアクセスせずに、必要に応じてブランチをチェックアウトできます。
この Bash スクリプトは私を助けてくれました:
#!/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 universeをコピーする前にセットアップをテストしてください。ワンライナーのクレジットはユーザー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 checkout -b somebranch Origin/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のmanページから:
<branch>が見つからないが内に正確に一致する名前を持つ1つのリモート(それを<remote>と呼ぶ)にトラッキングブランチが存在する場合は、と同等の扱い
$ 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参照/リモート/ Origin/dev
これは次のようになります。
ブランチdevはリモートブランチref/remotes/origin/devを追跡するように設定されました 新しいブランチ "dev"に切り替えられました
さて、あなたがdevブランチにいるとき、 "git pull"はあなたのローカルdevをリモートdevブランチと同じポイントに更新します。それはすべての枝を取得しますが、あなたが木のてっぺんに上にあるものだけを引っ張ることに注意してください。
"git clone git:// location"を実行すると、すべてのブランチとタグが取得されます。
特定のリモートブランチの上で作業するために、それがOriginのリモートであると仮定します。
git checkout -b branch Origin/branchname
エイリアスを使用してください。ネイティブのGit one-linerはありませんが、あなた自身を次のように定義できます
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 fetch Origin
これはあなたのローカルにすべてのリモートブランチを持ってくるでしょう。
git branch -a
これはあなたにすべてのリモートブランチを表示します。
git checkout --track Origin/<branch you want to checkout>
次のコマンドで、目的のブランチにいるかどうかを確認してください。
git branch
出力はこうなります。
*your current branch
some branch2
some branch3
現在の分岐を示す*記号に注目してください。
git clone
はすべてのリモートリモートブランチをダウンロードしますが、ファイルが新しいリポジトリに配置されていても、それらを「リモート」と見なします。例外が1つあります。クローン作成プロセスでは、「master」というリモートブランチから「master」というローカルブランチが作成されます。デフォルトでは、git branch
はローカルブランチのみを表示します。そのため、「master」しか表示されません。
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
は必要ありません)。
決して遅刻はしませんが、これを行うための最善の方法は次のとおりです。
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>
マスターブランチしか表示されない場合でも、すべてのブランチを表示するには "git branch -a"を使用できます。
git branch -a
そして、あなたはすでに持っているブランチに切り替えることができます。
git checkout <your_branch_name>
「git clone」の後、リモートレポジトリに接続する必要がないことを心配しないでください。それで、あなたが "git clone"をするとき、それはすでにリモートレポジトリからすべてのブランチをコピーしたことが証明されています。その後、あなたはリモートレポを必要としません、あなたのローカルはすでにすべてのブランチのコードを持っています。
git clone
はリポジトリ全体をコピーすることになっています。複製してから、git branch -a
を実行してください。それはすべての枝をリストするべきです。それからあなたが "master"の代わりに "foo"に分岐したい場合は、git checkout foo
を使います。
私のツール git_remote_branch を使ってください(あなたのマシンにはRubyが必要です)。リモートブランチの操作を簡単にするために特別に構築されています。
それはあなたに代わって操作をするたびに、それはコンソールに赤でそれを印刷します。時間が経つにつれて、彼らはついにあなたの脳に突き刺さる:-)
Grbに代わってコマンドを実行させたくない場合は、単に 'explain'機能を使用してください。コマンドは実行されるのではなく、コンソールに表示されます。
最後に、暗記を容易にするために、すべてのコマンドにエイリアスがあります。
これは alpha software ;-)です。
これはgrb helpを実行したときのヘルプです。
git_remote_branchバージョン0.2.6 使用法: 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] 注意: - Origin_serverが指定されていない場合は、 'Origin'という名前が使用されます[g。 default) - 名前変更機能は現在のブランチの名前を変更します Explainメタコマンド: キーワードに 'explain'を付けて任意のコマンドを追加することもできます。コマンドを実行する代わりに、git_remote_branch はその目的を達成するために実行する必要があるコマンドのリストを単に出力します。 例: grb explain create grb Explain create my_branch github すべてのコマンドにもエイリアスがあります。 create:create、new delete:delete、destroy、 [削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]、[削除]
ここで見たすべての答えは有効ですが、リポジトリを複製してすべてのブランチを一度に引っ張るためのはるかにクリーンな方法があります。
リポジトリをクローンすると、ブランチのすべての情報が実際にダウンロードされますが、ブランチは非表示になります。コマンドで
$ git branch -a
あなたはリポジトリのすべてのブランチを表示することができ、そしてコマンドで
$ git checkout -b branchname Origin/branchname
その後、それらを手動で一度に1つずつ「ダウンロード」できます。
しかし、たくさんのブランチでレポジトリを複製したい場合、上で説明したすべての方法は、少し複雑ではありますが、ここで説明するより簡潔で迅速な方法に関しては長くて退屈です。これを達成するには3つのステップが必要です。
あなたのマシン上に新しい空のフォルダを作成し、リポジトリから.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フォルダがあるだけです。
git設定のブール値 "bare"をfalseに切り替えて、このリポジトリを空の(ベア)リポジトリから通常のリポジトリに切り替えます。
$ git config --bool core.bare false
現在のフォルダ内にあるものすべてをつかみ、ローカルマシン上にすべてのブランチを作成します。したがって、これは通常のリポジトリになります。
$ git reset --hard
だから今、あなたはただコマンド "git branch"をタイプすることができますそしてあなたはすべてのブランチがダウンロードされているのを見ることができます。
これはgitリポジトリを一度にすべてのブランチでクローンすることができる簡単な方法ですが、この方法ですべての単一プロジェクトに対してやりたいことではありません。
私はそれを短縮することが可能であることに気づいた質問に対する答えの一つを見て:
for branch in `git branch -r | grep -v 'HEAD\|master'`; do
git branch --track ${branch##*/} $branch;
done
ただし、リモートブランチの1つが、たとえば、次のように指定されている場合は注意してください。 admin_masterそれはダウンロードされません!
独創的なアイデアを寄せてくれたbigfishに感謝
OK、 リポジトリを複製すると、そこにすべてのブランチがあります。
git branch
を実行するだけでは、それらはちょっと隠されています...
あなたがすべてのブランチの名前を見たいのであれば、単にこのように--all
フラグを追加するだけです:
git branch --all
またはgit branch -a
ブランチにチェックアウトするだけで、必要なものがすべて手に入ります。
しかし、クローン作成後に他の人が作成したブランチがどうだったのでしょうか。
この場合は、次のようにしてください。
git fetch
そしてもう一度すべてのブランチをチェックしてください...
フェッチとチェックアウトを同時にしたい場合は、次のようにします。
git fetch && git checkout your_branch_name
また、私が言ったことを簡単にするために、下の画像も作成しました。
ローカルレポジトリからのクローン作成は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
#!/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
私はこの小さな Powershell 関数を書いて、Originのリモートにあるすべての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設定リポジトリ にあります。
私もまったく同じようにする必要がありました。これが私の Ruby スクリプトです。
#!/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は通常(指定されていない場合)履歴を完成させるのに必要なオブジェクトと共に1つ以上の他のリポジトリからすべてのブランチやタグ(参照:git ls-refs
)を取得します。言い換えれば、すでにダウンロードされているオブジェクトから到達可能なオブジェクトを取得します。参照してください: 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
それでもマスターブランチ以外に入手できない場合は、以下を確認してください。
git remote -v
)を再確認してください、例えば git config branch.master.remote
がOrigin
であることを確認してください。Origin
がgit remote show Origin
で正しいURLを指しているか確認してください(こちらの post をご覧ください)。2017年初めの時点で、答え このコメントの中に は動作します。
git fetch <Origin-name> <branch-name>
はあなたのために分岐を下げます。これですべてのブランチを一度に取得するわけではありませんが、ブランチごとに個別に実行できます。
ユーザーの誰もが正しい道を進んでいることを除いて、これらの答えのどれもそれを切らなかった。
あるサーバー/システムから別のサーバー/システムにリポジトリを移動するのに問題がありました。レポジトリをクローンしたとき、それはmasterのローカルブランチしか作成しなかったので、新しいremoteにプッシュしたとき、masterブランチだけがプッシュされました。
だから私はこれら二つの方法が非常に便利だと思った。彼らが他の誰かを助けることを願っています。
方法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
私はBitbucket、Atlassianのリポジトリホスティングサービスを使っています。だから私は彼らのドキュメントに従うようにしてください。そしてそれは私にとっては完璧に機能します。以下の簡単で短いコマンドで、あなたはあなたのリモートブランチをチェックアウトすることができます。
まずリポジトリのクローンを作成してから、目的のフォルダに移動します。そして最後になりましたが、少なくともフェッチしてチェックアウトするわけではありません。
git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>
それでおしまい。もう少し現実的な例を示します。
git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop
コマンドの詳細については、ドキュメントを参照してください。 クローンコマンド 、 フェッチコマンド 、 チェックアウトコマンド
すべてのリモートブランチのローカルブランチを作成する別の短い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
ここにawkを使用した答えがあります。このメソッドは、新しいリポジトリで使用する場合に十分です。
git branch -r | awk -F/ '{ system("git checkout " $NF) }'
既存のブランチは単純にチェックアウトされるか、すでに存在するものとして宣言されますが、競合を避けるためにフィルターを追加できます。
また、明示的なgit checkout -b <branch> -t <remote>/<branch>
コマンドを呼び出すように変更することもできます。
または、代わりにリモートブランチを指定できます。これは murphytalk の answer に基づいています。
git branch -r | awk '{ system("git checkout -t " $NF) }'
競合について致命的なエラーメッセージをスローしますが、それらは無害であると考えています。
両方のコマンドにエイリアスを作成できます。
nobody の answer を参照として使用すると、次のコマンドを使用してエイリアスを作成できます。
git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'
個人的にはtrack-all
またはtrack-all-branches
を使用します。
元のレポジトリのgit clone --mirror
はこれにはうまくいきます。
git clone --mirror /path/to/original.git
git remote set-url Origin /path/to/new-repo.git
git Push -u Origin
ローカルに削除したリモートブランチをプルダウンする方法を見つけようとしたので、ここに2セントを追加します。起源は私のものではありませんでした、そして私はすべてを再クローンすることの面倒を経験したくありませんでした
これは私のために働いた:
ローカルにブランチを作り直す必要があると仮定します。
git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-Origin/recreated-branch-name
それで、gituser/masterからsjpに分岐してからそれをsjp/mynewbranchに分岐した場合、このようになります。
$ git checkout -b mynewbranch
$ git branch -a
master
remotes/sjp/master
remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch
パーティーには少し遅れましたが、これがトリックだと思います。
mkdir YourRepo
cd YourRepo
git init --bare .git # create a bare repo
git remote add Origin REMOTE_URL # add a remote
git fetch Origin refs/heads/*:refs/heads/* # fetch heads
git fetch Origin refs/tags/*:refs/tags/* # fetch tags
git init # reinit work tree
git checkout master # checkout a branch
これが望ましくないことをするならば、私は知りたいです。しかし、これまでのところ、これは私のために働きます。
このバリエーションは、各ブランチを1つずつチェックアウトする必要なしに、ローカルで利用可能なすべてのブランチでリモートレポジトリを複製します。派手なスクリプトは必要ありません。
複製したいリポジトリと同じ名前のフォルダを作成し、cdします。
mkdir somerepo
cd somerepo
今これらのコマンドを実行しますが、実際のリポジトリユーザー名/名前を変更します。
git clone --bare [email protected]:someuser/somerepo.git .git
git config --bool core.bare false
git reset --hard
git branch
Voiala!あなたはそこにすべての枝を持っています!
これはgitプロジェクトのすべてのブランチとタグをスナップショットとして別々のフォルダに取得するためのbashスクリプトです。
https://Gist.github.com/hfossli/7562257
直接尋ねられたことではないかもしれませんが、何人かの人々はこの解決策を探してここに来るかもしれません。