모든 가지를 당기고 밀어 넣도록 git 설정


615

새로 만든 지점을 포함하여 기본적으로 모든 지점을 밀고 당기고 싶습니다.

내가 정의 할 수있는 설정이 있습니까?

그렇지 않으면 로컬에서 새 분기를 추가하고 서버에서 가져 오기를 원할 때 가장 간단한 방법은 무엇입니까?

이름이 같은 새 분기를 만들고 끌어 냈지만 작동하지 않습니다. 지점의 모든 원격 구성을 요구합니다. 어떻게 설정합니까?


4
"당기려고했지만 작동하지 않습니다." 자세한 내용을 확인하십시오. 어떤 명령을 사용하려고했는지 보여주세요.
Jakub Narębski

답변:


1297

가장 간단한 방법은 다음과 같습니다.

git push --all origin

태그와 분기를 푸시합니다.


10
내가 SO와 다른 곳에서 찾은 수십 개의 답변 중에서 이것은 구성을 건드리지 않고 새로 만든 로컬 지점을 푸시하는 가장 간단한 방법입니다. 감사!
András Szepesházi

174
-u예를 들어 git push --all origin -u추적을 한 번 추가 하면 추적을 설정 한 후 간단히 사용할 수 있습니다 git push.
Alec

23
자식 버전 1.7.12.3의 경우 git push --tags origin모든 태그를 푸시하는 데 사용해야 했습니다.
thisgeek

17
또한 "--all"대신에 "--mirror"를 보아라. 이것은 더 많은 것을 밀어 붙인다
Loda

21
경고 : 정리하지 않은 로컬 분기가 많은 경우 (기능, 핫픽스) 또는 제대로 정리하지 않은 경우 (me), 리모컨이 침수됩니다. 제길. 그리고 우리는 가지 치기를했습니다. 왜 내 지역에 너무 많은 가지가 남아 있는지 잘 모르겠습니다.
Jack

147

최신 git을 사용하면 항상 모든 분기 (원격 추적 분기로 refs/remotes/origin/*네임 스페이스에 git branch -r또는로 표시)를 가져옵니다git remote show origin .

기본적으로 ( push.defaultconfig 변수의 문서 참조 ) 일치하는 분기 를 푸시합니다. 즉, 먼저 git push origin branchgit이 항상 푸시 하도록해야 합니다 git push.

항상 모든 분기를 푸시 하려는 경우 푸시 기준 지정을 설정할 수 있습니다. 리모컨의 이름 origin이 있다고 가정하면 git config 를 사용할 수 있습니다 .

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

또는 .git/config다음과 같이 파일을 직접 편집 하십시오.

[원격 "원산지"
        url = user@example.com : /srv/git/repo.git
        가져 오기 = + refs / heads / * : refs / remotes / origin / *
        가져 오기 = + refs / tags / * : refs / tags / *
        푸시 = + refs / heads / * : refs / heads / *
        푸시 = + refs / tags / * : refs / tags / *

3
@Merc : git push --all origin모든 브랜치 및 태그를 한 번 게시하는 데 유용하지만, 현재 버전 '일치'시맨틱까지 기본 설정은 새 브랜치 또는 태그를 추가하지 않는 한 나중에 모든 브랜치를 푸시한다는 의미입니다. 설정"푸시는 [...] 기본적으로 모든 지점은" 기록 된대로.
Jakub Narębski

이 방법으로 Git을 재구성하는 방법을 추가하여 답변을 향상시킬 수 있습니다. 단순 모드를 설정 한 사용자에게 유용합니다.
Dereckson

3
이것은 git 2.0 이후로 변경되었습니다. 푸시 기본값은 단순하지만 더 이상 일치하지 않습니다.
mike

나는 이것을 시도 fatal: Invalid refspec ''+refs/heads/*:refs/heads/*''
Brian Lacy

2
이제 기본값 push.defaultsimple입니다.
hasanghaforian

32

푸시 사양에 +를 포함시키는 것은 아마도 나쁜 생각입니다 .git은 -f 없이도 빨리 감기를 수행하지 않으며 원격 서버가이를 수락하도록 설정하면 기록을 잃을 수 있습니다.

이것을 시도하십시오 :

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

--global각 저장소에 옵션을 추가하여 모든 리포지토리의 전역 기본값으로 만들 수도 있습니다 .
Ether

불행히도 +는 git에 의해 자동으로 추가된다 git remote add.
Ether

26

아래 명령을 사용하여 모든 분기를 새 저장소로 마이그레이션했습니다.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

참고 : 리포지토리 를 Atlassian Stash 에서 AWS CodeCommit (빈 리포지토리)로 복제하는 동안 두 번째 마지막 (즉, 마스터 우선 푸시) 명령을 사용해야했습니다 . 이유는 확실하지 않지만 ( git push new-origin --mirror) 기본 분기를 누른 후 이외의 다른 분기를 참조하고 있습니다 master.


1
리포지를 다른 호스트로 옮길 때 적합합니다. 감사합니다!
Pelmered

2
이것은 실제로 유용한 방법입니다. 사용 git push new_origin --all다만, new_origin에 기원의 모든 지점을 현재 현지 지사를 밀어 넣습니다.
yanzi1225627

이렇게하면 --bare저장소가 일반 저장소와 약간 다르며 .git파일이 아닌 파일 만 있습니다. 작업을 수행하지 않으면 완벽하게 충분합니다. 참조 --bare--mirror git-scm.com/docs/git-clone .
jmmut

실제 소스 코드가 아닌 .git 파일 만 가지고 있지만 원격 업데이트를 수행하면 출발지에서 목적지까지 모든 것을 다시 가져옵니다.
SanthoshM

이것은 생명의 은인이었습니다! 이 "master before mirror"방법은 Bitbucket이 대상이되고 "master"이외의 다른 지점이 주요 지점이라고 믿던 문제를 해결했습니다.
Toddius Zho

12

이전 리포지토리를 이전 리포지토리에서 새 리포지토리로 옮기고 로컬 리포지토리를 모두 가지고 있지 않은 경우 먼저 분기를 추적해야합니다.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

그런 다음 새 원격 저장소를 추가하십시오.

git remote add bb <path-to-new-repo>

그런 다음이 명령을 사용하여 모두 푸시 할 수 있습니다.

git push -u bb --all

또는이 작업을 한 번 수행하지 않거나 로컬 분기 만 이동하려는 경우 여기의 다른 응답에 표시된 git config 명령을 사용하여 repo를 구성 할 수 있습니다.

중요한 점은 다른 응답은 모든 LOCAL 분기 만 푸시한다는 것입니다. 분기가 대체 REMOTE 저장소에만있는 경우 먼저 추적하지 않고 이동하지 않습니다. 여기에 제시된 for 루프가 도움이 될 것입니다.


BTW, 나는 원래 / 오래된 저장소의 이름이 "origin"이라고 가정하고 여전히 해당 레이블에 첨부되어 있다고 가정하기 때문에 "origin"대신 "bb"를 사용하고 있습니다. "bb"는 Bitbucket의 경우 원래 리포지토리를 옮겼지만 원하는 경우 "neworigin"과 같이 더 적합한 것으로 부를 수 있습니다.
랜스 클리블랜드

2
그것은 나를 위해 작동하지 않았다. / : 모든 원격 지점이 동일한 로컬 브랜치를 추적과 함께 종료
jhsowter

2
AFAIK @jhsowter 의견에 따라 작동하지 않아야합니다. 새로 복제 된 리포지토리에서 원격 브랜치를 추적하는 올바른 명령은 git branch --track reponame origin/reponame그렇지 않으면 현재 로컬 브랜치에서 모든 원격 브랜치를 추적하는 것입니다.
Pioneer Skies

리포지토리 스 니펫을로 변경하여 git branch -r | grep -v '\->' | sed 's/ origin\///'원격 지사 이름 만 제공합니다.
Paul Hicks

6

사용 git branch -a하지 않고 모든 가지를 보려면 다음을 실행해야합니다.

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

이제 모든 가지를 볼 수 있습니다 :

git branch

모든 가지를 밀어 넣으려면 다음을 시도하십시오.

git push --all

1
λ git fetch --all origin fatal : fetch --all은 저장소 인수를 취하지 않습니다
foxundermon

당신은 노력하고 git fetch --all있습니까?
tokhi

4

모든 지점을 이전 리포지토리에서 새 리포지토리로 이동하는 경우 로컬 리포지토리에서 새 리포지토리로 푸시하기 전에 각 분기의 추적을 기존 오리진 분기로 설정해야합니다. 그렇지 않으면 모든 오리진 분기가 새로운 기원. 각 분기를 추적하거나 체크 아웃하여 수동으로 수행하거나 하나의 라이너를 사용하십시오.

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

이 한 줄 명령은이 페이지의 다른 답변에서 버전을 기반으로하지만 다음과 같은 이유로 더 좋습니다.

  1. 이 페이지에서이 명령의 일부 이전 변형과 달리 분기 추적을 올바르게 설정합니다.이 명령은 --track에 하나의 매개 변수 만 제공하므로 각 분기는 추적 마스터를 종료합니다.
  2. 개인적으로 원하지 않는 접두사 "origin /"없이 로컬 지점의 이름을 지정하며 지점을 정상적으로 체크 아웃 할 때 발생하는 것과 일치합니다.
  3. 이미 발생한 추적 마스터를 건너 뜁니다.
  4. 실제로 아무것도 체크 아웃하지 않으므로 빠릅니다.
  5. git branch -r의 출력에서->를 넘어 뜨리지 않도록합니다.

다음으로 원점을 전환하는 경우 이전 원점으로의 링크를 교체하고 새 리모콘을 가리 킵니다. bitbucket / github GUI를 사용하여 새 원격을 먼저 생성해야하지만 파일을 추가하지 마십시오. 병합 문제가 발생합니다. 예 :

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

이제 밀어 태그를 푸시하려면 두 번째 명령이 필요합니다.

git push -u --all origin
git push --tags origin

0

origin구성에서 하드 코딩 이 없는 솔루션

전역 gitconfig 에서 다음을 사용하십시오.

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

모든 브랜치 및 모든 태그를 푸시합니다.

origin설정에서 하드 코딩해서는 안 됩니까?

하드 코딩하는 경우 :

  1. origin모든 리포지토리에서 리모컨으로 끝납니다 . 따라서 원점을 추가 할 수는 없지만을 사용해야 set-url합니다.
  2. 도구가 다른 이름으로 리모컨을 만들면 모든 구성이 적용되지 않습니다. 그런 다음 리모컨의 이름을 바꿔야하지만 origin(1 지점부터) 이미 존재 하므로 이름 바꾸기가 작동하지 않습니다.

가져 오기는 현대 git에 의해 이미 처리되었습니다.

Jakub Narębski의 답변에 따라 :

최신 git을 사용하면 항상 모든 분기를 원격 추적 분기로 refs / remotes / origin / * 네임 스페이스로 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.