programing

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

goodsources 2023. 5. 1. 21:03
반응형

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

내 상황은...같은 레포에서 일하는 누군가가 그의 로컬 레포와 원격 레포에서 지점을 삭제했습니다.

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)

은 " 제목섹만있다니습에션▁titled" 섹션에만 .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. 할 수 입니다.
    repo, (예: 자담예지현당,담자,refs/heads/master)

먼저부터 git prune그러면 더 이상 참조되지 않는 개체가 제거되고 참조가 제거되지 않습니다.당신의 경우, 당신은 지역 지점을 가지고 있습니다.그 말은 심판의 이름이random_branch_I_want_deleted이는 해당 분기의 기록을 나타내는 일부 개체를 나타냅니다.으로는 그서따, 정에르면의래,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 " GUI"라는 이름으로 표시).git branch -r 이 .), 를 참조하십시오.

분기를 하려면 로컬분제면다사합용니다야해음을을 .git branch -d(또는)-D어디에도 병합되지 않는 경우).FWIW, 원격 분기가 사라질 경우 로컬 추적 분기를 자동으로 제거하는 git 명령이 없습니다.

git remote prune그리고.git fetch --prune동일한 작업을 수행하십시오. 원격에 존재하지 않는 지점에 대한 참조를 삭제하십시오.두 번째 명령은 원격에 연결하고 가지치기 전에 현재 분기를 가져옵니다.

그러나 체크아웃한 로컬 지점에는 영향을 주지 않으므로, 간단히 삭제할 수 있습니다.

git branch -d  random_branch_I_want_deleted

를 바꿉니다.-d타고-D지점이 다른 곳에 병합되지 않은 경우

git prune분기 또는 태그에서 연결할 수 없는 커밋을 제거하여 더 이상 필요하지 않은 다른 개체를 제거합니다.

누구나 관심을 가질 수 있는 경우.다음은 원격으로 추적되지 않는 모든 로컬 분기를 제거하는 빠른 셸 스크립트입니다.주의 사항:이렇게 하면 병합 여부에 관계없이 원격으로 추적되지 않는 모든 분기가 제거됩니다.

문제가 있으면 알려주시면 제가 수정하겠습니다(등).

다음파일저다라는 에 합니다.git-rm-ntbPATH실행:

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 --pruneTom Miller()tmiller의해 커밋 10a6cc8로 수정됨(1.9/2.0, 2014년 1분기):

추적 "" 는라 원지있때을이점적격추때▁""▁named"일 때.frotz/nitfol이전의 fetch에서, 그리고 업스트림에는 이제 "frotz"라는 이름의 분기가 있습니다.fetch"를 제거하지 못합니다.frotz/nitfola하▁"".git fetch --prune상류로부터
"git는사에를게자알것록려입줄다니도하사용용▁"를것▁the다▁g입g"를 사용하도록 알려줍니다.git remote prune문제를 해결하기 위해.

따라서, 업스트림 레포분기 계층 구조와 같은 이름의 분기("frotz/xxx")가 있을 때,git remote --prune성공했습니다(리포에서 원격 추적 지점 정리).git fetch --prune실패하고 있었습니다.

더 이상 없음:

법변경방변" 합니다.fetch --prune가져오기 작업 전에 가지치기 작업을 이동하여 작동합니다.
이렇게 하면 사용자에게 충돌을 경고하는 대신 자동으로 해결됩니다.


또 다른 차이점:

Git 2.39(git prune(man)Q4 2022)를 사용하면 ""를 반복할 수 있습니다..git/objects/pack삭제할 휴지통 파일의 경우 디렉터리가 없으면 큰 소리로 실패합니다.
명령은 이러한 실패를 무시하도록 학습되었습니다.

동안에하는 동안에git fetch --prune 큰 합니다.

에릭 ele828웡()의 커밋 6974765(2022년 11월 19일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 2022년 11월 28일 7d7ed48 커밋)

prune누락된 디렉터리에 대한 조용한 ENONT

사인 오프 바이: 에릭 웡

$GIT_DIR/objects/pack공유 저장소에 inode를 저장하기 위해 제거할 수 있습니다.
은 quiet down prune 중 일 경우$GIT_DIR/objects또는$GIT_DIR/objects/pack는 존재하지 않지만 다른 경우에는 사용자가 권한 문제나 리소스 제약 조건을 진단하는 데 도움이 되도록 시스템 오류를 내보냅니다.

그래서, "디렉토리를 열 수 없습니다..."는 다음과 같은 경우 git prune을 수행할 수 없습니다.$GIT_DIR/objects또는$GIT_DIR/objects/pack누락되었습니다.

언급URL : https://stackoverflow.com/questions/20106712/what-are-the-differences-between-git-remote-prune-git-prune-git-fetch-prune

반응형