약 5개의 분기가 포함된 Git 리포지토리를 복제했습니다. git branch
수행하면 그 중 하나만 볼 수 있습니다.
$ git branch * master
git branch -a
를 수행하여 모든 분기를 볼 수 있다는 것을 알고 있지만 모든 분기를 로컬로 가져오려면 어떻게 해야 git branch
하면 다음과 같이 표시됩니까?
$ git branch * master * staging * etc...
질문자 :David542
약 5개의 분기가 포함된 Git 리포지토리를 복제했습니다. git branch
수행하면 그 중 하나만 볼 수 있습니다.
$ git branch * master
git branch -a
를 수행하여 모든 분기를 볼 수 있다는 것을 알고 있지만 모든 분기를 로컬로 가져오려면 어떻게 해야 git branch
하면 다음과 같이 표시됩니까?
$ git branch * master * staging * etc...
다음과 같이 모든 리모컨에서 모든 분기를 가져올 수 있습니다.
git fetch --all
그것은 기본적으로 힘의 움직임 입니다.
fetch
는 원격 브랜치의 로컬 복사본을 업데이트하므로 로컬 브랜치에는 항상 안전 하지만 다음과 같습니다.
fetch
는 로컬 브랜치를 업데이트 하지 않습니다(원격 브랜치 를 추적함). 로컬 브랜치를 업데이트하려면 여전히 모든 브랜치를 가져와야 합니다.
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
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 --all
및 git remote update
는 동일합니다.
사람들이 유용하다고 생각한 Kamil Szot의 의견.
나는 사용해야했다 :
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
origin/branchname
이라는 로컬 분기를 생성했고 내가 참조할 때마다 "refname 'origin/branchname'이 모호합니다.
원격 분기를 나열하려면:
git branch -r
다음을 사용하여 로컬 분기로 확인할 수 있습니다.
git checkout -b LocalName origin/remotebranchname
원격 브랜치를 추적하는 로컬 브랜치를 생성해야 합니다.
origin
이라는 원격이 하나만 있다고 가정하면 이 스니펫은 모든 원격 추적에 대한 로컬 분기를 생성합니다.
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
그 후, git fetch --all
은 원격 브랜치의 모든 로컬 복사본을 업데이트합니다.
또한 git pull --all
은 로컬 추적 분기를 업데이트하지만 로컬 커밋과 '병합' 구성 옵션이 설정되는 방식에 따라 병합 커밋을 생성하거나 빨리 감기 또는 실패할 수 있습니다.
당신이 할 경우:
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
$ git remote update $ git pull --all
이것은 모든 분기가 추적된다고 가정합니다.
그렇지 않은 경우 Bash에서 실행할 수 있습니다.
for remote in `git branch -r `; do git branch --track $remote; done
그런 다음 명령을 실행합니다.
Bash for
루프는 저에게 효과가 없었지만 이것은 제가 원했던 것과 정확히 일치했습니다. 내 원점의 모든 분기가 로컬에서 동일한 이름으로 미러링되었습니다.
git checkout --detach git fetch origin '+refs/heads/*:refs/heads/*'
아래 Mike DuPont 의 의견을 참조하십시오. 나는 Jenkins Server에서 이것을 분리 헤드 모드로 유지하려고 시도했다고 생각합니다.
git fetch && git checkout RemoteBranchName
사용하십시오.
그것은 나를 위해 아주 잘 작동합니다 ...
저장소를 복제하면 분기의 모든 정보가 실제로 다운로드되지만 분기는 숨겨집니다. 명령으로
$ git branch -a
저장소의 모든 분기를 표시할 수 있으며 다음 명령을 사용하여
$ git checkout -b branchname origin/branchname
그런 다음 한 번에 하나씩 수동으로 "다운로드"할 수 있습니다.
그러나 조금 복잡하긴 하지만 훨씬 더 깨끗하고 빠른 방법이 있습니다. 이를 수행하려면 세 단계가 필요합니다.
첫 번째 단계
컴퓨터에 새 빈 폴더를 만들고 저장소에서 .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 저장소를 복제할 수 있는 빠른 방법이지만 모든 단일 프로젝트에 대해 이 방식으로 수행하려는 것은 아닙니다.
다음을 통해 모든 분기를 가져올 수 있습니다.
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에서 리포지토리 복제 문서를 참조하세요.
나는 일반적으로 다음과 같은 명령 외에는 아무 것도 사용하지 않습니다.
git fetch origin git checkout --track origin/remote-branch
조금 더 짧은 버전:
git fetch origin git checkout -t origin/remote-branch
원격 저장소에 있는 모든 분기를 추적합니다.
수동으로 수행:
<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
다음과 같이 저장소를 복제했다고 생각합니다.
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 서버로 마이그레이션하는 솔루션을 찾고 있다면 아래 프로세스를 정리했습니다. 모든 분기를 로컬로 업데이트하려면 첫 번째 빈 줄에서 중지하십시오.
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>
.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
등을 실행하십시오 ...
마스터 리포지토리를 복제한 후 다음을 실행할 수 있습니다.
git fetch && git checkout <branchname>
이것은 테스트를 거쳤으며 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
이 세 가지 명령만 모든 분기를 가져옵니다.
git clone --mirror repo.git .git (gets just .git - bare repository) git config --bool core.bare false git reset --hard
루핑이 작동하지 않는 것 같았고 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
나는 새로운 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>
평소와 같이 복제하지만 모든 원격 분기에 대한 로컬 추적 분기를 만듭니다.
다음은 강력하다고 생각되는 사항입니다.
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
필요하지 않습니다.
이 답변에 대한 크레딧 .
별칭 설정: (상위 답변 기준)
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
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
fetch --all
문제가 있으면 원격 분기를 추적하십시오.
git checkout --track origin/%branchname%
|‾‾‾‾‾‾‾‾‾‾‾‾‾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
모든 분기 또는 태그 이름을 임시 파일에 넣은 다음 각 이름/태그에 대해 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
다음은 허용되는 답변에 제공된 한 줄짜리 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
'치명적인: '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
git clone [...]
및 cd
-ing을 생성된 디렉토리에 수행한 후 수행한 작업은 다음과 같습니다.
git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
나를 위해 일했지만 그것이 당신을 위해 일할 지 모르겠습니다. 조심하세요.
출처 : http:www.stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches
JavaScript에서 'new' 키워드는 무엇입니까? (0) | 2021.12.30 |
---|---|
현재 Git 브랜치를 마스터 브랜치로 만들기 (0) | 2021.12.29 |
GitHub에서 커밋을 제거하려면 어떻게 해야 하나요? [복제하다] (0) | 2021.12.29 |
NodeJS 및 NPM을 다음 버전으로 업데이트하려면 어떻게 해야 합니까? (0) | 2021.12.29 |
Vim에서 전체 줄을 복제하는 방법은 무엇입니까? (0) | 2021.12.29 |