Git에서 잘못된 원격 지사 참조를 어떻게 제거합니까?


731

현재 리포지토리에는 다음과 같은 출력이 있습니다.

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

remotes/public/master지점 목록에서 삭제하고 싶습니다 .

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

또한 git remote목록에 없기 때문에 출력 이 이상합니다 public.

$ git remote show 
origin

지점 목록에서 '원격 / 공공 / 마스터'를 어떻게 삭제합니까?

업데이트하고 git push명령을 시도하십시오 .

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
나요 git remote prune [remote-name]git fetch -p [remote-name]시나리오에서 작동하지? 함께하는 git gc것이 일반적으로 필요한 것보다 훨씬 강력합니다.
rjmunro

6
git remote prune [remote-name]git svn 에서는 작동 하지 않지만 git gc... git branch -rd origin/name하지만 작동하지 않습니다. @Casey, 아마도 두 번째 대답을 선택해야 할 것입니다-그것은 덜 위험합니다.
naught101

4
나는이 질문을 좋아한다. 거의 매월 돌아 오는
oluckyman


2
앞으로 n00b gitter 오류를 피하려면 master특히 원격에서 삭제할 때와 는 다른 가지를 사용하는 것이 좋습니다 .
absynce

답변:


743

정리가 필요할 수 있습니다.

git gc --prune=now

또는 자두가 필요할 수 있습니다.

git remote prune public

치다

<name> 아래의 모든 부실 추적 분기를 삭제합니다. 이 오래된 분기는 <name>에서 참조하는 원격 저장소에서 이미 제거되었지만 "remotes / <name>"에서 여전히 로컬로 사용 가능합니다.

--dry-run 옵션을 사용하면 잘라낼 가지를보고하지만 실제로 제거하지는 않습니다.

그러나 이것으로 이전에 정리해야합니다.

git remote rm public 

rm

이름이 <name> 인 원격을 제거하십시오. 원격에 대한 모든 원격 추적 분기 및 구성 설정이 제거됩니다.

따라서 구성 파일을 수동으로 편집했을 수 있으며 이것이 발생하지 않았거나 권한 문제가 있습니다.

어쩌면 다시 실행하고 무슨 일이 일어나는지보십시오.


조언 컨텍스트

개정 로그를 살펴보면 어떤 이유로 든 저장소에서 작업하고 싶지 않은 더 "올바른"기술을 제안했습니다.

나는 OP가 나무를 일관성이없는 상태로 남겨두고 뭔가 이상하게 행동하게하고 무언가를 왼쪽 git gc으로 고치기 위해 무언가를 한 것으로 의심했다 .

일반적으로 git branch -rd origin/badbranch 로컬 추적 분기 git push origin :badbranch를 핵 또는 원격 분기를 핵을 위해 충분 하며 일반적 으로 전화를 걸 필요 가 없습니다.git gc


4
원격 측의 분기를 삭제하고 싶지 않습니다. 미묘한 차이가 있다고 생각합니다.
cmcginty

2
문제는 효과적으로 "원격 지사를 삭제하는 방법"을 묻는 것입니다. 그 경로는 무엇입니까.
Kent Fredric

1
내가 묻는 것을 더 명확하게하면 주제를 다시 말하지만 명령은 내 문제가 무엇인지 정확하게 보여줍니다.
cmcginty

40
git gcgit은 어떤 원격 브랜치가 수행되는지 확인하기 때문에 여기서 필요하지 않지만 git remote prune수동으로 항목을 삭제하는 것보다 안전하다고 생각 git branch -rd합니다.
마이크 Seplowitz

3
그러나 이것은 나를 위해 작동하지 않았습니다- 'git branch -rd'는 정상적으로 작동했습니다.
dsummersl

683

당신이해야 할 일은

git fetch -p

원격으로 삭제 된 모든 로컬 브랜치를 제거합니다.

git 1.8.5 이상을 사용하는 경우 자동으로 설정할 수 있습니다

git config fetch.prune true

또는

git config --global fetch.prune true

7
이것은 내가 찾던 것이기도합니다. 질문은 일반적인 시나리오보다 복잡한 시나리오를 설명합니다.
rjmunro

22
해당 리모컨이 삭제 된 로컬 브랜치를 삭제하는 방법을 찾고 있지만 작동하지 않습니다. 왜 그런지 알아?
jackocnr

11
이렇게하면 원격 / 원점에 나열된 분기가 제거되지만 로컬 추적 분기는 삭제되지 않습니다.
BlueRaja-대니 Pflughoeft

@Cupcake 첫 번째 편집 (Git 1.8.5+에 대한 잘못된 정보를 수정 한)을 롤백하지 않았으므로 이제 이것을 잘못 만들었습니다. 내 두 번째 편집은 내가 넣은 내용을 잘못 수정했으며 이제는 롤백과 함께 다시 나타납니다. 계속해서 원본을 갖기 위해 다시 한 번 편집을 롤백하십시오. 감사.
ferventcoder

@ferventcoder 마지막 ​​편집 내용을 두 번 확인하고 롤백했습니다. OP가 마음에 들지 않으면 다시 롤백 할 수 있습니다. 감사.

319
git push public :master

이것은 masterKent Fredric이 지적한 원격 지사를 삭제합니다 .

원격 추적 분기를 나열하려면

git branch -r

원격 추적 분기를 삭제하려면

git branch -rd public/master

6
이것은 git-svn remote ghost branch를 제거하는 데 도움이되었습니다.
Nick

9
git branch -rd removed_remote/branchgit gc --prune=now는 쓸모없는 동안 나를 위해 일 했다.
rchampourlier

2
나는 git prune아무런 문제없이 사용할 수 있었지만, 우리의 주요 저장소를 포크 한 동료는 git branch -rd public/master자신의 환경을 정리 하기 위해 스타일 솔루션을 사용합니다 .
Abel

3
git branch -rd public/master내가 잃어버린 것입니다. 나는 heroku/master~ herkou/master... lol woops
Aaron

@rchampourlier 100 % 무가치하지 않음-git repo가 ​​크면 사용하지 않는 브랜치를 제거하면 일부 상황에서 많은 디스크 공간을 확보 할 수 있습니다.
peterh-Reinstate Monica

159

당신이해야 할 일은

$ git branch -rd origin/whatever 

그렇게 간단합니다. 여기에 gc를 호출 할 이유가 없습니다.


1
github에 삭제하는 방법을 어떻게 "푸시"합니까?
Thufir

14
@Thufir 그것은이 질문에 관한 것이 아닙니다. 이 질문은 로컬 리포지토리에 잘못된 원격 참조가 있지만 해당 지점이 더 이상 원격 서버에 존재하지 않는 상황에 적합합니다. 귀하의 질문에 대한 답변은 $ git push origin입니다. : whatever
jpswain

예, 지점이 삭제 된 원격 리포지토리에서 문제가 발생하지만 로컬 컴퓨터의 해당 원격 지사에 대한 참조가있는 경우 원래 답변에 넣은 것을 정리해야합니다.
jpswain

6
정리 작업이 많은 경우 (많은 매달린 리모컨), 모든 원격 브랜치를 삭제 git branch -rd $(git branch -r)하고 가져 오기를 수행하여 유효한 브랜치 를 다시 설정할 수 있습니다.
nobar

내 상황은 git config -e리모콘의 이름을 바꾸는 데 사용 되었습니다. 나는 원격 이름을 변경 mine하는 방법에 대해 origin. 그런 다음 이것이 저에게 가장 효과적인 솔루션이었습니다.git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now 당신이 원하는 것이 아닙니다.

git remote prune public

또는 git remote prune origin# 원격 소스 인 경우

당신이 원하는 것입니다


6
@Casey $ git gc #는 저장소 파일의 속도를 높이기 위해 git 파일의 조각 모음을 좋아합니다. $ git remote prune origin # "git branch -r | grep origin"으로 표시되는 오래된 원격 브랜치를 삭제합니다. 그것이 내가 믿는 질문입니다. 따라서 명령이 완전히 다릅니다.
tongueroo

29

심판이 포장되었을 때 수락 된 답변이 효과가 없었습니다. 그러나 이것은 다음을 수행합니다.

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

나를 위해 일했다. 일반 git branch -d가 작동하지 않았습니다. 실수로 만든 .git / config 파일에서 "original"이라는 원점을 제거했기 때문에 branch가 존재하지 않는 오류를 반환했습니다.
micrub

이것은 내 .git / config에서 실수로 생략 된 분기를 제거하는 데 사용해야하는 방법입니다 (관련되지 않은 손상으로 인해 다시 작성해야 함). 이 답변이 너무 멀리 떨어져 체인이 너무 나빠서 마침내 솔루션을 발견하고 받아 들인 답변에 추가하기 전에는 그것을 알지 못했습니다!
taranaki

이것이 svn2git을 사용한 후에 필요한 것입니다. 리모컨 / svn / * 분기가 많이있었습니다. 가짜 'svn'원격을 먼저 만들어야했습니다.
Sam

7

제 경우에는에 저장된 항목을 삭제하려고했습니다 .git/packed-refs. 이 일반 텍스트 파일을 편집 git br -D하고 터치하는 방법을 모르는 항목을 삭제할 수 있습니다 (최소한 버전 1.7.9.5 이상).

이 솔루션을 여기에서 찾았습니다 : https://stackoverflow.com/a/11050880/1695680


와우, 이것은 나를 도왔다. 내 동료는 VS를 다시 시작하고 컴퓨터를 다시 시작했지만 아무것도 작동하지 않았습니다. 로컬 리포지토리를 삭제하고이를 제거하기 위해 모든 것을 가져옵니다. :)
Esen

1
오늘이 압축 참조 파일은 git gc커밋을 압축 된 압축 파일로 압축 할 때 참조를 단일 일반 텍스트 파일로 이동 시켰으며, 최적화 목적 으로이 참조 파일의 일부로 작성되었다는 사실을 알고 있었습니다. 나는 미래 버전의 git이 git br -D ...ref 를 포장 할 수 있기를 바랍니다 .
ThorSummoner


3

에 대해 몰랐 git branch -rd으므로 이와 같은 문제를 직접 해결하는 방법은 내 리포 지를 원격 리포지토리로 취급하고 원격 삭제를 수행하는 것입니다. git push . :refs/remotes/public/master. 다른 방법으로 작동하지 않고 제거하려는 이상한 참조가있는 경우이 원시 방법은 확실합니다. 모든 종류의 참조를 제거 (또는 생성) 할 수있는 정확한 정밀도를 제공합니다.


2

약간만 관련되어 있지만 여전히 동일한 상황에서 도움이 될 수 있습니다. 원격 저장소에 네트워크 파일 공유를 사용합니다. 지난 주 일이 진행되고 있었는데 이번 주에는 "원격 원점이 지점 참조 / 헤드 / 마스터에 대한 참조를 광고하지 않았습니다.이 참조는 원격에 없거나 권한 설정에 의해 숨겨져있을 수 있습니다"라는 오류가 발생했습니다.

그러나 우리는 사물을 부패시키는 일이 없다고 믿었습니다. NFS는 스냅 샷을 작성하여 각 "이전 버전"을 검토 한 후 3 일 전에 리포지토리의 MB 크기가 282MB에서 33MB로 바뀌 었으며 약 1,403 개의 새 파일과 300 개의 폴더가 존재 함을 확인했습니다. 나는 동료들에게 질문을했고, 그날 한 사람은 그 날 푸시를 시도했지만 그것을 취소했다.

NFS "복원"기능을 사용하여 해당 날짜 직전까지 복원했으며 이제는 모든 것이 제대로 작동합니다. 나는 자두를 이전에 시도했지만 도움이되지 않는 것 같습니다. 아마도 가혹한 정리가 효과가 있었을 것입니다.

이것이 언젠가 다른 누군가를 도울 수 있기를 바랍니다!

어치


2

나는 비슷한 문제가 있었다. 어떤 대답도 도움이되지 않았습니다. 필자의 경우 두 개의 제거 된 원격 저장소가 영구적으로 표시되었습니다.

내 마지막 아이디어는 모든 참조를 손으로 제거하는 것이 었습니다.

저장소가“Repo”라고 가정 해 봅시다. 나는했다 :

find .git -name Repo 

따라서 .git 폴더에서 해당 파일과 디렉토리를 삭제했습니다 ( 이 폴더는 Rails 앱 또는 컴퓨터 https://stackoverflow.com/a/19538763/6638513 에서 찾을 수 있습니다 ).

그런 다음 :

grep Repo -r .git

이것은 해당 줄을 제거한 텍스트 파일을 발견했습니다. 이제 모든 것이 괜찮은 것 같습니다.

일반적으로이 작업을 git 상태로 두어야합니다.

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