카테고리 보관물: Git

Git

git remote prune, git prune, git fetch –prune 등의 차이점은 무엇입니까? tracked develop

내 상황은 이것입니다 … 같은 리포지토리에서 일하는 사람이 로컬 및 원격 리포지토리에서 지점을 삭제했습니다 …

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':

왜?



답변

나는 이것에 대해 좌절했다고 당신을 비난하지 않습니다. 가장 좋은 방법은 이것입니다. 모든 원격 지점에는 세 가지 버전이 있습니다.

  1. 원격 저장소에 실제 지점
    (예를 들어, 원격 REPO에서 https://example.com/repo.git , refs/heads/master)
  2. 로컬 해당 분기의 스냅 샷 (저장 아래 refs/remotes/...)
    (예를 들면, 지역의 repo, refs/remotes/origin/master)
  3. 그리고 원격 지점을 추적 할 수있는 로컬 지점
    (예 : 로컬 저장소 refs/heads/master)

로 시작하겠습니다 git prune. 이 제거합니다의 객체 참조되지 않게되고, 그것은 참조를 제거하지 않습니다. 귀하의 경우 지역 지점이 있습니다. 즉 random_branch_I_want_deleted, 해당 분기의 히스토리를 나타내는 일부 오브젝트를 나타내는 ref라는 이름 이 있습니다. 따라서 정의상을 git prune제거하지 않습니다 random_branch_I_want_deleted. 실제로 git pruneGit에 축적되었지만 아무 것도 참조하지 않는 데이터를 삭제하는 방법입니다. 일반적으로 지점에 대한 귀하의 견해에는 영향을 미치지 않습니다.

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병합되지 않은 경우) 를 사용해야합니다 . FWIW에는 원격 분기가 사라지면 로컬 추적 분기를 자동으로 제거하는 git 명령이 없습니다.


답변

git remote prunegit fetch --prune 당신이 말한대로, 원격에 존재하지 않는 지점에 심판을 삭제 : 같은 일을. 두 번째 명령은 리모트에 연결하고 정리하기 전에 현재 분기를 페치합니다.

그러나 체크 아웃 한 현지 지점을 만지지 마십시오.

git branch -d  random_branch_I_want_deleted

교체 -d-D 분기 다른 곳에서 병합되지 않은 경우

git 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 $@


답변

한가지 차이점 유의 git remote --prune하고 git fetch --prune함께 고정되는 10a6cc8를 저지 하여, 톰 밀러 ( tmiller) (자식 1.9 / 2.0, Q1 2014) :

frotz/nitfol이전 페치에서 ” ” 라는 원격 추적 분기가 있고 업스트림에 이제 “** frotz “** 라는 분기가 있으면 업스트림에서 fetchfrotz/nitfol“로 ” ” 를 제거하지 못합니다 git fetch --prune.
git은 사용자에게 ” git remote prune“를 사용하여 문제를 해결 하라고 알려줍니다 .

따라서 업스트림 리포지토리에 브랜치 계층 구조 와 이름이 같은 브랜치 ( “frotz”)가있는 경우 ( “frotz / xxx”, 브랜치 명명 규칙 ), 리포지토리 git remote --prune에서 원격 추적 브랜치를 정리할 때 성공했습니다. 하지만git fetch --prune 실패했다.

더 이상 :

fetch --prune가져 오기 작업 전에 제거 작업을 이동하여 ” “작동 방식을 변경하십시오 .
이런 식으로 사용자에게 충돌을 경고하는 대신 자동으로 수정합니다.


답변