etc./StackOverFlow

모든 Git 브랜치를 가져오는 방법

청렴결백한 만능 재주꾼 2021. 12. 28. 01:51
반응형

질문자 :David542


약 5개의 분기가 포함된 Git 리포지토리를 복제했습니다. git branch 수행하면 그 중 하나만 볼 수 있습니다.

 $ git branch * master

git branch -a 를 수행하여 모든 분기를 볼 수 있다는 것을 알고 있지만 모든 분기를 로컬로 가져오려면 어떻게 해야 git branch 하면 다음과 같이 표시됩니까?

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


다음과 같이 모든 리모컨에서 모든 분기를 가져올 수 있습니다.

 git fetch --all

그것은 기본적으로 힘의 움직임 입니다.

fetch 는 원격 브랜치의 로컬 복사본을 업데이트하므로 로컬 브랜치에는 항상 안전 하지만 다음과 같습니다.

  1. fetch 는 로컬 브랜치를 업데이트 하지 않습니다(원격 브랜치 를 추적함). 로컬 브랜치를 업데이트하려면 여전히 모든 브랜치를 가져와야 합니다.

  2. fetch 는 로컬 분기( 원격 분기를 추적 하는)를 생성 하지 않으므로 수동으로 수행해야 합니다. 모든 원격 분기를 나열하려면 git branch -a

원격 분기를 추적하는 로컬 분기를 업데이트하려면:

 git pull --all

그러나 이것은 아직 충분하지 않을 수 있습니다. 원격 지점을 추적하는 로컬 지점에서만 작동합니다. 모든 원격 분기를 추적하려면 git pull --all 전에 이 oneliner를 실행하십시오.

 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은 모든 리모트에서 모든 브랜치를 가져오는 것 같지만, 저는 항상 확실하게 하기 위해 먼저 가져옵니다.)

로컬 분기에서 추적하지 않는 원격 분기가 서버에 있는 경우에만 첫 번째 명령을 실행하십시오.

PS AFAIK git fetch --allgit remote update 는 동일합니다.



사람들이 유용하다고 생각한 Kamil Szot의 의견.

나는 사용해야했다 :

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

origin/branchname 이라는 로컬 분기를 생성했고 내가 참조할 때마다 "refname 'origin/branchname'이 모호합니다.


Wookie88

원격 분기를 나열하려면:

 git branch -r

다음을 사용하여 로컬 분기로 확인할 수 있습니다.

 git checkout -b LocalName origin/remotebranchname

Learath2

원격 브랜치를 추적하는 로컬 브랜치를 생성해야 합니다.

origin 이라는 원격이 하나만 있다고 가정하면 이 스니펫은 모든 원격 추적에 대한 로컬 분기를 생성합니다.

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

그 후, git fetch --all 은 원격 브랜치의 모든 로컬 복사본을 업데이트합니다.

또한 git pull --all 은 로컬 추적 분기를 업데이트하지만 로컬 커밋과 '병합' 구성 옵션이 설정되는 방식에 따라 병합 커밋을 생성하거나 빨리 감기 또는 실패할 수 있습니다.


Michael Renner

당신이 할 경우:

 git fetch origin

그러면 그들은 모두 로컬에 있을 것입니다. 다음을 수행하는 경우:

 git branch -a

remote/origin/branch-name으로 나열되는 것을 볼 수 있습니다. 그들이 현지에 있기 때문에 당신이 그들과 함께 원하는 무엇이든 할 수 있습니다. 예를 들어:

 git diff origin/branch-name

또는

 git merge origin/branch-name

또는

 git checkout -b some-branch origin/branch-name

GoZoner

$ git remote update $ git pull --all

이것은 모든 분기가 추적된다고 가정합니다.

그렇지 않은 경우 Bash에서 실행할 수 있습니다.

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

그런 다음 명령을 실행합니다.


Johnno Nolan

Bash for 루프는 저에게 효과가 없었지만 이것은 제가 원했던 것과 정확히 일치했습니다. 내 원점의 모든 분기가 로컬에서 동일한 이름으로 미러링되었습니다.

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

아래 Mike DuPont 의 의견을 참조하십시오. 나는 Jenkins Server에서 이것을 분리 헤드 모드로 유지하려고 시도했다고 생각합니다.


Tim Lum

git fetch && git checkout RemoteBranchName 사용하십시오.

그것은 나를 위해 아주 잘 작동합니다 ...


Regis Zaleman

저장소를 복제하면 분기의 모든 정보가 실제로 다운로드되지만 분기는 숨겨집니다. 명령으로

 $ git branch -a

저장소의 모든 분기를 표시할 수 있으며 다음 명령을 사용하여

 $ git checkout -b branchname origin/branchname

그런 다음 한 번에 하나씩 수동으로 "다운로드"할 수 있습니다.


그러나 조금 복잡하긴 하지만 훨씬 더 깨끗하고 빠른 방법이 있습니다. 이를 수행하려면 세 단계가 필요합니다.

  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 저장소를 복제할 수 있는 빠른 방법이지만 모든 단일 프로젝트에 대해 이 방식으로 수행하려는 것은 아닙니다.


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에서 리포지토리 복제 문서를 참조하세요.


kenorb

나는 일반적으로 다음과 같은 명령 외에는 아무 것도 사용하지 않습니다.

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

조금 더 짧은 버전:

 git fetch origin git checkout -t origin/remote-branch

marioosh

당신은 그들을 추적하지 않기 때문에 원격 분기를 볼 수 없습니다.

  1. 모든 원격 분기(또는 추적하려는 분기)를 추적하고 있는지 확인하십시오.
  2. 원격 분기를 반영하도록 로컬 분기를 업데이트하십시오.

모든 원격 지점 추적:

원격 저장소에 있는 모든 분기를 추적합니다.

수동으로 수행:

<branch> git branch -r 의 출력에서 표시되는 분기로 대체합니다.

 git branch -r git branch --track <branch>

bash 스크립트로 수행하십시오.

 for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

게으른 방법(이는 병합 충돌로 인해 엉망이 될 수 있으므로 주의하십시오):

 git checkout master git pull

로컬 컴퓨터의 원격 분기에 대한 정보 업데이트:

이것은 로컬 리포지토리에서 추적 중인 원격 리포지토리의 분기에 대한 업데이트를 가져옵니다. 이것은 로컬 지점을 변경하지 않습니다. 로컬 git repo는 이제 원격 repo 분기에서 발생한 일을 인식합니다. 예를 들어 새 커밋이 원격 마스터에 푸시된 경우 가져오기를 수행하면 로컬 마스터가 커밋 1개 늦었다는 경고가 표시됩니다.

 git fetch --all

로컬 컴퓨터의 원격 분기에 대한 정보를 업데이트하고 로컬 분기를 업데이트합니다.

원격에서 로컬 분기로의 모든 분기에 대해 페치 후 병합을 수행합니다. 예를 들어 새 커밋이 원격 마스터에 푸시되고 풀을 수행하면 원격 분기의 변경 사항에 대한 로컬 저장소가 업데이트되고 해당 변경 사항이 로컬 분기에 병합됩니다. 이것은 병합 충돌로 인해 상당히 엉망이 될 수 있습니다.

 git pull --all

basickarl

다음과 같이 저장소를 복제했다고 생각합니다.

 git clone https://github.com/pathOfrepository

이제 cd를 사용하여 해당 폴더로 이동합니다.

 cd pathOfrepository

git status 를 입력하면 다음을 모두 볼 수 있습니다.

 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

Abhinav bhardwaj

여기에서 모든 분기를 가져온 다음 모든 것을 다른 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>

ingyhere

.git/config 파일에서 모든 원격 분기를 가져올 수 있는지 확인합니다.

이 예에서 git fetch --all 을 시도하더라도 origin/production production 브랜치를 가져오는 것 외에는 아무 일도 일어나지 않습니다.

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

이 줄은 다음으로 대체되어야 합니다.

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

그런 다음 git fetch 등을 실행하십시오 ...


Ahmad

마스터 리포지토리를 복제한 후 다음을 실행할 수 있습니다.

 git fetch && git checkout <branchname>

Davidacce

단일 원격을 추적하는 모든 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

기술적으로 새 로컬 분기에는 가져오기가 필요하지 않습니다.

이 중 하나를 사용할 수 있습니다 fetch 또는 pull 모두 새로운 원격 (들)에 변경 사항이 분기합니다.

병합할 준비가 된 경우에만 당기십시오.


테스트 설정

SSH URL로 저장소를 확인하십시오.

 git clone git@repository.git

전에

현지 지점을 확인하십시오.

 $ 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

Greg Weigner

이 세 가지 명령만 모든 분기를 가져옵니다.

 git clone --mirror repo.git .git (gets just .git - bare repository) git config --bool core.bare false git reset --hard

Izabela Skibinska

루핑이 작동하지 않는 것 같았고 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

poxion

나는 새로운 repo를 복제하고 모든 원격 브랜치에 대한 로컬 브랜치를 만드는 것을 관리하는 작은 스크립트를 작성했습니다.

여기 에서 최신 버전을 찾을 수 있습니다.

 #!/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>

평소와 같이 복제하지만 모든 원격 분기에 대한 로컬 추적 분기를 만듭니다.


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 pull -all 을 전달하면 이 옵션이 내부 fetch 전달되므로 git fetch --all 필요하지 않습니다.

이 답변에 대한 크레딧 .


Tom Hale

별칭 설정: (상위 답변 기준)

 git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

이제 모든 분기를 추적하려면 다음을 수행하십시오.

git track-all-branches


Trake Vital

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

kiewic

fetch --all 문제가 있으면 원격 분기를 추적하십시오.

 git checkout --track origin/%branchname%

open-ecommerce.org

|‾‾‾‾‾‾‾‾‾‾‾‾‾fetch/clone‾‾‾‾‾‾‾‾‾‾‾‾↓ |‾‾‾‾‾‾‾‾‾‾‾‾checkout‾‾‾‾‾‾‾‾‾‾↓ |‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾pull‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾↓ Remote repository (`origin`) <=> Local repository <=> Index <=> Workspace ↑_________________push_______________| ↑____commit____| ↑____add_____|
 # 拉取远程仓库所有分支信息→ 本地仓库# fetch all remote repository branch meta → local repository git remote set-branches origin '*' git fetch -v # 把所有远程分支数据搞到本地# fetch all remote repository branch data → local repository git branch -r | grep -v '\->' | while read remote; do git branch "${remote#origin/}" "$remote"; done git fetch --all git pull --all

山茶树和葡萄树

다음과 같이 이 한 줄 명령으로 모든 괄호를 가져올 수 있습니다.

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

Muhammad Numan

모든 분기 또는 태그 이름을 임시 파일에 넣은 다음 각 이름/태그에 대해 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

anhlc

다음은 허용되는 답변에 제공된 한 줄짜리 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(제 경우에는 원본)을 수정하여 복구 중인 대상 저장소를 가리켰습니다.

git remote set-url origin <remote-url>

그리고 마침내 다음과 같이 모든 지점을 원점으로 푸시했습니다.

git push --all origin

그리고 우리는 다시 사업을 시작했습니다.


Jose Quijada

여러 가지 방법을 시도했지만 이 방법만 간단하고 저에게 효과적입니다.

 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

TangHongWan

'치명적인: '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

ChrisZZ

git clone [...]cd -ing을 생성된 디렉토리에 수행한 후 수행한 작업은 다음과 같습니다.

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

나를 위해 일했지만 그것이 당신을 위해 일할 지 모르겠습니다. 조심하세요.


erikano

출처 : http:www.stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches

반응형