git remote prune, git prune, git fetch --prune 등의 차이점은 무엇입니까?
내 상황은 이것입니다 ... 같은 리포지토리에서 일하는 사람이 로컬 및 원격 리포지토리에서 지점을 삭제했습니다 ...
Stack Overflow 또는 다른 사이트에서 이러한 종류의 문제에 대해 질문 한 사람들은 대부분 git branch -a
맨 아래 의 원격 추적 분기 목록 에 분기 문제가 여전히 표시됩니다 .
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
그러나 내 상황에서 거기에 없어야하는 지점은 로컬입니다.
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
다음 중 하나를 수행해도 로컬로 제거되지 않습니다.
$ git prune
나는 또한 시도했다 :
$ git remote prune origin
$ git fetch --prune
더 유용한 정보 : 확인 git remote show origin
하면 이것이 어떻게 보이는지입니다.
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
이 섹션은 제목이있는 섹션에만 있습니다. Local branches configured for 'git pull':
왜?
나는 이것에 대해 좌절했다고 당신을 비난하지 않습니다. 가장 좋은 방법은 이것입니다. 모든 원격 지점에는 세 가지 버전이 있습니다.
- 원격 저장소에 실제 지점
(예를 들어, 원격 REPO에서 https://example.com/repo.git ,refs/heads/master
) - 로컬 해당 분기의 스냅 샷 (저장 아래
refs/remotes/...
)
(예를 들면, 지역의 repo,refs/remotes/origin/master
) - 그리고 원격 지점을 추적 할 수있는 로컬 지점
(예 : 로컬 저장소refs/heads/master
)
로 시작하겠습니다 git prune
. 이 제거합니다의 객체 참조되지 않게되고, 그것은 참조를 제거하지 않습니다. 귀하의 경우 지역 지점이 있습니다. 이는 random_branch_I_want_deleted
해당 분기의 히스토리를 나타내는 일부 오브젝트를 나타내는 ref라는 이름이 있음을 의미합니다. 따라서 정의상을 git prune
제거하지 않습니다 random_branch_I_want_deleted
. 실제로 git prune
Git에 축적되었지만 아무 것도 참조하지 않는 데이터를 삭제하는 방법입니다. 일반적으로 지점에 대한 귀하의 견해에는 영향을 미치지 않습니다.
git remote prune origin
그리고 git fetch --prune
둘 다 아래의 참조에서 작동합니다 refs/remotes/...
(이것은 원격 참조라고 부릅니다). 현지 지사에는 영향을 미치지 않습니다. 이 git remote
버전은 특정 원격에서 원격 참조 만 제거하려는 경우에 유용합니다. 그렇지 않으면 두 사람은 정확히 같은 일을합니다. 그래서, 짧은에, git remote prune
그리고 git fetch --prune
위의 2 번에서 작동합니다. 예를 들어, git web GUI를 사용하여 브랜치를 삭제하고 더 이상 로컬 브랜치 목록에 표시하지 않으려면 ( git branch -r
), 이것이 사용해야하는 명령입니다.
로컬 브랜치를 제거하려면 git branch -d
(또는 -D
병합되지 않은 경우) 를 사용해야합니다 . 그러나 원격 지점이 사라지면 로컬 추적 지점을 자동으로 제거하는 git 명령이 없습니다.
git remote prune
그리고 git fetch --prune
당신이 말한대로, 원격에 존재하지 않는 지점에 심판을 삭제 : 같은 일을. 두 번째 명령은 리모트에 연결하고 정리하기 전에 현재 분기를 페치합니다.
그러나 체크 아웃 한 현지 지점을 만지지 마십시오.
git branch -d random_branch_I_want_deleted
교체 -d
에 의해 -D
분기 다른 곳에서 병합되지 않은 경우
git prune
다른 무언가를 수행하여 도달 할 수없는 객체, 분기 또는 태그에서 도달 할 수없는 커밋을 제거하여 더 이상 필요하지 않습니다.
한가지 차이점 유의 git remote --prune
하고 git fetch --prune
함께 고정되는 10a6cc8를 저지 하여, 톰 밀러 ( tmiller
) (자식 1.9 / 2.0, Q1 2014) :
frotz/nitfol
이전 페치에서 " " 라는 원격 추적 분기가 있고 업스트림에 이제 "** frotz "** 라는 분기가 있으면 업스트림에서fetch
"frotz/nitfol
"로 " " 를 제거하지 못합니다git fetch --prune
.
git은 사용자에게 "git remote prune
"를 사용하여 문제를 해결 하라고 알려줍니다 .
따라서 업스트림 리포지토리에 브랜치 계층 구조 와 동일한 이름을 가진 브랜치 ( "frotz")가있는 경우 ( "frotz / xxx", 브랜치 명명 규칙 ), 리포지토리 git remote --prune
에서 원격 추적 브랜치를 정리하는 데 성공했습니다. 그러나 git fetch --prune
실패했다.
더 이상 :
fetch --prune
가져 오기 작업 전에 제거 작업을 이동하여 " "작동 방식을 변경하십시오 .
이런 식으로 사용자에게 충돌을 경고하는 대신 자동으로 수정합니다.
누군가가 관심을 가질 경우. 원격으로 추적되지 않는 모든 로컬 분기를 제거하는 빠른 셸 스크립트가 있습니다. 주의 사항 : 병합 여부에 관계없이 원격으로 추적되지 않은 분기를 제거합니다.
이 문제가 발생하면 알려 주시면 해결하겠습니다 (등 등).
라는 파일에 저장 git-rm-ntb
(호출 무엇이든)에 PATH
및 실행 :
git-rm-ntb <remote1:optional> <remote2:optional> ...
clean()
{
REMOTES="$@";
if [ -z "$REMOTES" ]; then
REMOTES=$(git remote);
fi
REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
RBRANCHES=()
while read REMOTE; do
CURRBRANCHES=($(git ls-remote $REMOTE | awk '{print $2}' | grep 'refs/heads/' | sed 's:refs/heads/::'))
RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHES[@]}")
done < <(echo "$REMOTES" )
[[ $RBRANCHES ]] || exit
LBRANCHES=($(git branch | sed 's:\*::' | awk '{print $1}'))
for i in "${LBRANCHES[@]}"; do
skip=
for j in "${RBRANCHES[@]}"; do
[[ $i == $j ]] && { skip=1; echo -e "\033[32m Keeping $i \033[0m"; break; }
done
[[ -n $skip ]] || { echo -e "\033[31m $(git branch -D $i) \033[0m"; }
done
}
clean $@
'Programming' 카테고리의 다른 글
C ++에서 어떤 XML 파서를 사용해야합니까? (0) | 2020.03.06 |
---|---|
파이썬 문자열에서 어떻게 백분율 (%)을 이스케이프 처리 할 수 있습니까? (0) | 2020.03.06 |
int a [] = {1,2,}; (0) | 2020.03.06 |
PHP에서 배열 요소의 키를 어떻게 변경합니까? (0) | 2020.03.06 |
C #에서 현재 사용자의 데스크톱 경로를 얻는 방법은 무엇입니까? (0) | 2020.03.06 |