programing

모든 Git 브랜치를 가져오려면 어떻게 해야 하나요?

fastcode 2023. 4. 15. 09:34
반응형

모든 Git 브랜치를 가져오려면 어떻게 해야 하나요?

기트 ★★★★★★★★★★★★★★.git branch 딱하나밖에 안 요.

$ git branch
* master

요?git branch , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

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

TL;DR 응답

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(풀은 모든 리모트로부터 모든 브랜치를 취득하는 것 같습니다만, 만약을 위해서 항상 먼저 취득합니다).

첫 번째 명령어는 서버에 로컬브런치로 추적되지 않는 리모트브런치가 있는 경우에만 실행합니다.

완전한 답변

다음과 같이 모든 리모트로부터 모든 브랜치를 취득할 수 있습니다.

git fetch --all

기본적으로 파워 무브입니다.

fetch는 리모트브런치의 로컬복사를 갱신하여 로컬브런치에서는 항상 안전합니다만, 다음과 같습니다.

  1. fetch로컬 브랜치(리모트브런치를 추적하는 것)는 갱신되지 않습니다.로컬 브랜치를 갱신하는 경우는, 모든 브랜치를 풀 할 필요가 있습니다.

  2. fetch로컬 브랜치(리모트브런치를 추적하는 )는 작성되지 않습니다.이 작업은 수동으로 수행해야 합니다.모든 리모트브런치를 표시하는 경우:git branch -a

원격 지점을 추적하는 로컬 지점을 업데이트하려면:

git pull --all

그러나, 이것은 여전히 불충분할 수 있습니다.리모트 브런치를 추적하는 로컬브런치에서만 동작합니다.모든 원격 분기를 추적하려면 다음 시간 전에 이 Oneliner를 실행하십시오. git pull --all:

git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

git fetch --all ★★★★★★★★★★★★★★★★★」git remote update등합니니다다



Kamil Szot의 코멘트, 사람들이 유용하다고 느꼈습니다.

다음을 사용해야 했습니다.

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

에 의해 가 생성되었기 에, 「」라고 하는 이름의 되었습니다.origin/branchname '마다 애매합니다.' 'origin/branchname은 'origin/branchname'이 됩니다.

리모트 브랜치를 리스트 하려면:

git branch -r

리모트 브런치를 로컬브런치로서 체크 아웃 하려면 , 다음의 순서에 따릅니다.

git checkout -b local_branch_name origin/remote_branch_name

리모트 브랜치를 추적하는 로컬브런치를 작성해야 합니다.

가정하면origin.「 」

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

후 ★★★★★★★★★★★★★★★★★.git fetch --all는 리모트 브랜치의 모든 로컬복사를 갱신합니다.

ㅇㅇㅇㅇ.git pull --all는 로컬 트래킹브런치를 갱신하지만 로컬 커밋과 'marge' 설정 옵션에 따라 머지 커밋, 패스트포워드 또는 실패가 발생할 수 있습니다.

필요한 경우:

git fetch origin

모두 지역별로 있을 겁니다그 후 다음 작업을 수행합니다.

git branch -a

리모트/메모트/메모트명으로 표시됩니다.그들은 로컬에 있기 때문에 당신이 원하는 것은 무엇이든 할 수 있습니다.예를 들어 다음과 같습니다.

git diff origin/branch-name 

또는

git merge origin/branch-name

또는

git checkout -b some-branch origin/branch-name
$ git remote update
$ git pull --all

이것은 모든 브랜치가 추적되는 것을 전제로 합니다.

그렇지 않으면 Bash에서 실행할 수 있습니다.

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

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

주의: 아래 경고 댓글을 읽어보십시오.

배쉬 ★★for루프가 나한테는 안 먹혔지만, 이건 내가 원하는 대로 됐어.내 출신 브랜치는 모두 로컬에서 동일한 이름으로 미러링되었습니다.

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

Mike DuPont의 코멘트를 이하에서 참조해 주세요.Jenkins 서버에서 이 작업을 수행하려고 했던 것 같습니다. Jenkins 서버는 분리된 헤드 모드로 유지됩니다.

git fetch && git checkout RemoteBranchName.

나한테는 아주 잘 먹히는데...

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

$ git branch -a

저장소의 모든 브랜치를 표시할 수 있습니다.또한 명령어를 사용하여

$ git checkout -b branchname origin/branchname

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


하지만, 조금 복잡하긴 하지만 훨씬 더 깨끗하고 빠른 방법이 있습니다.이를 위해서는 다음 3가지 단계가 필요합니다.

  1. 제1단계

    시스템에 빈 폴더를 새로 만들고 저장소에서 .vl 폴더의 미러 복사본을 복제합니다.

    $ 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" 명령어를 사용하여 .folder가 숨겨져 있을 뿐입니다.

  2. 두 번째 단계

    git 설정의 부울값 "false"를 false로 바꿈으로써 빈 (빈) 저장소에서 일반 저장소로 바꿉니다.

    $ git config --bool core.bare false
    
  3. 세 번째 단계

    현재 폴더 안에 있는 모든 항목을 가져와 로컬 머신에 모든 분기를 생성하면 일반 보고서가 됩니다.

    $ git reset --hard
    

만 하면 됩니다.git branch모든 브랜치가 다운로드 되어 있는 것을 알 수 있습니다.

이것은 모든 브런치를 가진 git 저장소를 한 번에 복제할 수 있는 빠른 방법이지만, 이러한 방식으로 모든 프로젝트에서 수행할 수 있는 것은 아닙니다.

다음 방법으로 모든 브랜치를 가져올 수 있습니다.

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할 수 , 를 「복제」로 클론 ."repo" "repo"--single-branch확인합니다.git config remote.origin.fetch.

그 후, 어느 지점에서도 체크 아웃 할 수 있습니다.

다음 항목도 참조하십시오.


모든 브런치를 리모트에 푸시하려면 다음 명령을 사용합니다.

git push --all

으로는, 「」입니다.--mirror이치노


저장소를 복제하는 것이 목표라면 GitHub에서 저장소 문서 복제하기를 참조하십시오.

보통 다음과 같은 명령어만 사용합니다.

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

조금 더 짧은 버전:

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

리모트 브랜치를 트래킹 하고 있지 않기 때문에, 리모트 브랜치는 표시되지 않습니다.

  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

Lazy way(마지 충돌로 인해 혼란이 발생할 수 있습니다.

git checkout master
git pull

로컬 컴퓨터의 원격 지점에 대한 정보를 업데이트합니다.

로컬 리포에서 추적 중인 원격 리포에서 브랜치 업데이트를 가져옵니다.로컬 브랜치는 변경되지 않습니다.당신의 로컬 git repo는 이제 리모트 repo 브랜치에서 발생한 일을 인식하고 있습니다.예를 들어 새로운 커밋이 리모트마스터에 푸시된 경우 fetch를 실행하면 로컬마스터가 1커밋 늦어지고 있음을 알립니다.

git fetch --all

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

리모트 브랜치에서 로컬브런치로의 모든 브랜치에 대해 페치를 실시한 후 머지를 실시합니다.예를 들어 리모트마스터에 새로운 커밋이 푸시된 경우 풀링을 실행하면 리모트브런치 변경에 대한 로컬보고가 갱신되고 그 변경이 로컬브런치로 Marge됩니다.이렇게 하면 병합 충돌로 인해 상당히 혼란스러울 수 있습니다.

git pull --all

만약 당신이 모든 지사를 가지고 모든 것을 다른 Git 서버로 이행하기 위한 솔루션을 찾고 있다면, 나는 아래의 과정을 조립합니다.모든 브랜치를 로컬로 갱신하는 경우 첫 번째 빈 행에서 정지합니다.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master|main/{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>

다음과 같은 방법으로 저장소를 복제했다고 생각합니다.

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

브랜치가 취득 ..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 fetchsyslog...

마스터 저장소를 복제한 후에는

git fetch && git checkout <branchname>

다음의 3개의 명령어만으로 모든 브랜치가 취득됩니다.

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

git config --bool core.bare false

git reset --hard

모든 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;

설명:

1개의 라이너는 체크아웃 후 HEAD를 제외한 모든 브랜치를 가져옵니다.

리모트 트래킹브런치를 일람표시합니다.

git branch -r

HEAD를 무시합니다.

grep -v ' -> '

리모트로부터 브랜치명을 삭제합니다.

cut -d"/" -f2

단일 리모콘을 추적하는 모든 지점을 확인합니다.

git checkout $branch

체크아웃된 분기를 가져옵니다.

git fetch

기술적으로 새로운 로컬브런치에는 fetch가 필요하지 않습니다.

은 ''에 할 수 .fetch ★★★★★★★★★★★★★★★★★」pull새로운 브랜치 및 리모트 변경이 있는 브랜치.

Marge할 준비가 된 경우에만 당겨야 합니다.


테스트 셋업

SSH URL을 가진 저장소를 확인합니다.

git clone git@repository.git

전에

로컬 브런치를 확인합니다.

$ git branch
* master

명령어 실행

1개의 라이너를 실행합니다.

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

끝나고

로컬 브랜치에 리모트브런치가 포함되어 있는지 확인합니다.

$ git branch
  cicd
  master
* preprod

루핑은 나에게 효과가 없는 것 같았고 나는 원산지/마스터를 무시하고 싶었다.나한테 효과가 있었던 건 이거야

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

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

다음은 견고하다고 생각되는 사항입니다.

  • 기존 지점의 원격 추적을 업데이트하지 않음
  • HEADorigin/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로로 합니다.git pull는 이 합니다.fetch.

답변에 감사드립니다.

git을 가지고 놀 때는 조심해, 차근차근.

$ git remote update  //This will update your local
$ git branch -a      //This will list all the branches(After updating you can now 
see the new branch in the list)
$ git checkout your_branch_name

에일리어스 설정: (상위 답변에 따라)

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

|‾‾‾‾‾‾‾‾‾‾‾‾‾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

새로운 레포 복제를 관리하고 모든 원격 지점의 로컬 지점을 만드는 간단한 스크립트를 작성했습니다.

다음 사이트에서 최신 버전을 찾을 수 있습니다.

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

정상적으로 복제되지만 모든 리모트브런치에 로컬트래킹 브랜치를 만듭니다.

fetch --all이치노

git checkout --track origin/%branchname%

다음과 같은 한 줄 명령으로 모든 브라치를 가져올 수 있습니다.

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

모든 브랜치 또는 태그 이름을 임시 파일에 넣고 각 이름/태그에 대해 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

TLDR 리모트트래킹 브랜치별로 로컬브런치를 작성하는 것은 좋지 않을 수 있습니다.이러한 브런치 유형은 각각 다른 용도로 사용되며 일반적으로 로컬 브런치는 필요에 따라 생성됩니다. git branch를 나타냅니다.git branch -r에 리모트 트래킹브런치를 나타냅니다. git branch -a에 둘 다 나타냅니다.적절한 fetch 명령을 사용하여 모든 원격 추적 분기를 업데이트할 수 있습니다.보통은 그것만 있으면 돼요.


기존 답변을 스크롤하면 두 가지 유형이 나타납니다. 즉, 다른 접근 방식을 제안하는 것이 아니라 단순히 질문에 대답하는 것입니다.그리고 이유를 설명하지 않고 다른 접근법을 제안하는 사람들.여기 조금 더 설명하려는 저의 시도가 있습니다.

실제로 일반적인 git 저장소가 처리해야 하는 브랜치는 세 가지가 있습니다.이 세 가지 가지 가지들은 각기 다른 용도를 가지고 있다.요컨대:

  • 리모트 브랜치:리모트 저장소에 존재하는 브랜치입니다.리모트 브랜치에서 직접 읽을 수 없습니다.리모트 브랜치의 판독은 모두 이른바 「리모트 트래킹 브랜치」를 통해서 행해집니다.

  • 리모트 트래킹브런치:git은 리모트브런치의 로컬스냅샷을 보관합니다.이것은 가장 정확하게 "리모트 트래킹브런치"라고 불립니다.전화하면 갱신됩니다.git fetch ★★★★★★★★★★★★★★★★★」git pull(서양속담, 돈속담)리모트 트래킹브런치에서는 로컬브런치를 작성하지 않고 리모트트래킹브런치를 사용할 수 있는 경우가 많습니다.

    예를 들어 다음과 같습니다.

    git merge origin/master
    

    Marge를 .origin/master로컬 복사본을 먼저 작성할 필요 없이 현재 로컬 브랜치로 이동합니다. 「」가 .origin/master 입니다.master에, 「」라고 하는 이름의 리모트레포지토리에 존재합니다.origin 것이 .이와 같은 작업을 수행하기 전에 가져오기를 수행할 수 있습니다.

  • 로컬 브랜치: 이력상의 특정 포인트에 대해 수동으로 작성한 스냅샷입니다(대부분은 적어도 처음에 리모트트래킹 브랜치를 기반으로 합니다).다른 종류보다 훨씬 정적이기 때문에 수동으로 변경할 때만 실제로 변경됩니다.한 명씩.작업 트리(프로젝트 디렉토리)에서 로컬브런치의 내용을 표시하거나 커밋을 추가할 때 로컬브런치를 사용할 수 있습니다.

로컬 브랜치(및 브랜치 내용 공개)를 완료한 후 삭제를 검토할 수 있습니다.그러면 최신 상태를 유지할 필요가 없습니다.결국, 가져오기는 현재 로컬 브랜치를 업데이트하지 않으며 풀은 현재 체크아웃된 로컬 브랜치만 업데이트합니다.즉, 로컬 브랜치는 필요할 때만 만들고 필요하지 않을 때는 삭제해야 합니다.

는 기본적으로 있다는하지 않을 이다.일부 브랜치는 기본적으로 숨겨져 있습니다'라고 하는 것은 정확하지 않을 수 있습니다. 보는는는 rathergit branch명령어는 "로컬브런치"를 표시하기 위해 작성되었습니다.하시면 됩니다.git branch -r 및 '''를 합니다.git branch -a로컬 브랜치와 리모트트래킹 브랜치를 모두 표시합니다.이들 2종류의 브랜치는 다른 용도로 기능하기 때문에 각 리모트트래킹에 로컬브런치를 필요로 하지 않습니다.

또한 리모트 이름으로 시작하는 로컬브런치를 만들고 슬래시를 붙이는 것은 보통 좋지 않습니다(예를 들어 리모트트래킹브런치 이름과 경합하기 때문에 "origin/master"라는 이름의 로컬브런치를 작성하는 것은 좋지 않은 생각인 경우가 많습니다).

브랜치를 갱신할 때는, fetch 커맨드의 다양한 플레이버에 대해 설명하는 것이 적절합니다.

  • git fetch는 현재 "브런치 이치노리모트는 현재 체크아웃된 브런치의 "브런치"에서 사용되는 것과 일치합니다.체크아웃된 브런치에 업스트림세트가 없는 경우 "origin"이라는 이름의 리모트로부터의 취득(존재하는 경우)으로 폴백됩니다.이 명령어는 가장 쉽고 대부분의 경우 충분합니다.
  • git fetch --all 소속된 리모트에 관계없이 모든 리모트트래킹 브랜치를 갱신합니다.

특히 좋아하는 것은

git fetch -tf --all

또, 리모트 브랜치에서 도달할 수 없는 태그를 포함한 모든 태그가 항상 갱신(필요에 따라서 덮어쓰기)됩니다.

다음은 승인된 답변에 제공된 원라이너 버전의 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

다시 사업을 시작했죠

여러 가지 방법을 시도했지만, 이것만 간단하고 나에게 효과가 있습니다.

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

언급URL : https://stackoverflow.com/questions/10312521/how-do-i-fetch-all-git-branches

반응형