Git checkout / pull이 디렉토리를 제거하지 않습니까?


82

내 repo @ github가 있습니다. 나는 집에서 일을했고 그것을 github에 푸시했다. 파일과 디렉토리의 일부 삭제가 포함되었습니다. 이제 파일과 디렉터리를 삭제하기 전에 코드 복사본이있는 작업 상자에 있습니다.

다음을 발행했습니다.

git remote update
git checkout HEAD
git pull origin HEAD

있어야 할 모든 파일을 삭제했지만 파일이있는 디렉토리는 삭제하지 않았습니다.

두 가지 질문 :

  1. 디렉토리를 제거하지 않은 이유는 무엇입니까?
  2. 현재 상태에서이를 제거하기 위해 실행할 수있는 git 명령이 있습니까?

HEAD는 현재 체크 아웃 된 커밋을 가리키는 참조이므로 git checkout HEAD는 아무것도하지 않습니다. 두 경우 모두 마스터로 갈 것입니다.
Cascabel

글쎄, HEAD는 실제로 빈 디렉토리를 삭제하는 것을 제외하고 모든 것을 업데이트했습니다. 내가 말했듯이, 나는 git을 처음 사용합니다.
mculp

의 가능한 중복 나는 "자식 풀을"강제로 어떻게 로컬 파일을 덮어? 여전히 다른 솔루션을 원한다면 답을 확인하십시오.
DrBeco

답변:


151

Git은 디렉토리를 추적하지 않으므로 병합 또는 기타 변경으로 인해 비어있는 디렉토리는 제거하지 않습니다. 그러나, 당신이 사용할 수있는 git clean -fd비 추적 디렉토리 (제거하는 -fd플래그 수단 (F) 의 비 추적 파일과의 ORCE 제거 D irectories을).


4
혼란 스러워요. 그렇다면 변경 사항을 커밋 / 푸시 할 때 GitHub 저장소에서 디렉토리가 삭제 된 이유는 무엇입니까?
mculp

1
작업 복사본의 디렉토리에 추적되지 않은 파일 (추적되지 않은 숨겨진 파일 포함)이 포함되어있을 수 있으므로 비어있는 것처럼 보이지만 실제로는 그렇지 않으므로 Git에서 제거하지 않았습니다. git clean물론입니다.
mipadi

4
GitHub 리포지토리 가 베어 리포지토리 (작업 복사본이 없음) 라는 사실과 관련이있을 수 있지만 로컬 리포지토리 는 그렇습니다 . GitHub 오리진에서 저장소 를 복제 했다면 해당 디렉토리가 없을 것입니다.
mipadi

18
그러나 물론 먼저 명령을 실행하는 -n대신 (dry run)을 사용 하여 명령을 실행하면 -f삭제 될 항목을 볼 수 있습니다. 특히 이후 git clean -d제거합니다하지 그 worisome 디렉토리뿐만 아니라 비 추적 파일.
Todd Owen

2
@EliGolin : 옵션 git clean을 전달하지 않으면 .gitignore에 나열된 파일을 삭제하지 않습니다 -x.
mipadi 2016-06-20

4

작업 트리를 변경하는 대부분의 작업 (pull, merge, checkout 등)의 일부로 git은 해당 작업에 의해 비워진 모든 디렉토리를 제거합니다 (예 : git이 마지막 파일을 제거함).

git은 완전히 비어 있지 않은 디렉터리를 제거하지 않으므로 파일을 숨기거나 무시한 경우 git이 해당 디렉터리에서 마지막으로 추적 된 파일을 제거 한다고해서 git이 해당 디렉터리를 제거 할 수 있다는 의미는 아닙니다. git은 이것을 오류 조건으로 간주하지 않으므로 불평하지 않습니다.


내 GitHub 저장소에 디렉토리가 없습니다. 커밋했을 때 디렉토리가 올바르게 제거되었습니다. 그러나 체크 아웃 / 풀 때 파일 만 제거됩니다. 디렉토리가 비어 있습니다. $ ls -al total 8 drwxr-xr-x 2 mculp mculp 4096 Sep 23 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 Sep 30 10:51 ../
mculp

1
"헤드를 마스터로 전환"이 무슨 뜻인지 잘 모르겠습니다. " git checkout master" 을 의미 한다고 생각하지만 대부분의 사람들은 "마스터로 전환 / 체크 아웃했습니다"라고 말할 것입니다. 어쨌든 git이 '이미 최신 상태'라고 말했을 때. 그것은 아무것도하지 않았다는 것을 의미합니다. 자식은 오직 그 디렉토리를 제거 할 수 있습니다 빈.
CB Bailey

잘못된 표현입니다. 일부 사람들이 의견에서 제안한대로 "HEAD"를 "마스터"로 변경했습니다.
mculp

@CharlesBailey, 당신이 말한 것은 내가 보는 것이 아닙니다. git checkout완전히 빈 디렉토리를 제거하지 않았습니다.
Acumenus 2010 년

@ABB : Git 은 체크 아웃 작업으로 인해 비워진 디렉터리 만 제거 합니다. 나는 이것을 다시 테스트했다. 여전히 작동합니다.
CB Bailey

2

Git은 디렉토리, 파일 (경로 포함)을 추적하지 않습니다. Git은 경로가 아직 존재하지 않는 경우 해당 경로에 대한 모든 디렉토리를 생성하지만 (멋진!) 경로에 포함 된 모든 파일이 이동되거나 삭제되면 삭제 하지 않습니다 (멋진 것은 아니지만 ☹ ...하지만 이유가 있습니다).

해결 방법 (풀 / 빨리 감기 / 병합 후) :

git stash --include-untracked
git clean -fd
git stash pop

stash이전에 하지 않으면 clean추적되지 않은 모든 파일이 손실됩니다 (비가 역적으로).

참고 : 이렇게하면 무시 된 모든 파일도 정리되므로 프로젝트 메타 데이터 (예 :)를 다시 생성하려면 일부 빌드 스크립트를 다시 실행해야 할 수 있습니다 ./gradlew eclipse. 또한 비어 있고 git 파일 경로의 일부가 아닌 디렉토리도 삭제합니다.


2

필자의 경우 빌드 서비스 (CI)에서 동일한 문제가 발생했습니다. 여전히 DLL을 포함하고 존재하지 않는 테스트를 언급합니다.

이 문제를 해결하려면 이 명령은 트릭을 수행하는 것 같습니다 (적어도 나를 위해)

git clean -fd -x

X는 추적되지 않은 모든 파일을 제거합니다.

-X Git에서 무시되는 파일 만 제거합니다. 이것은 모든 것을 처음부터 다시 빌드하는 데 유용 할 수 있지만 수동으로 만든 파일은 유지합니다.


-1

Git은 현재 디렉터리를 추적하지 않습니다 ( git wiki 참조 ). 즉, 빈 디렉터리를 추가 할 수도없고 빈 디렉터리를 제거 할 수도 없습니다. (편집 : 감사합니다, Manni, 내가 틀 렸습니다! 빈 디렉터리를 추가 할 수는 없지만 추적 된 콘텐츠가 삭제 되었기 때문에 git은 빈 디렉터리를 제거 합니다. )

빈 디렉토리를 제거하는 명령에 관해서는 운영 체제에 따라 다릅니다.

Linux의 경우 다음을 사용할 수 있습니다.

find -depth -type d -empty -exec rmdir {} \;

그러나 이것은 모든 빈 디렉토리를 제거 합니다 !


1
위키 페이지는 git이 당신을 위해 빈 디렉토리를 생성하지 않는다고 말합니다. 빈 디렉토리를 삭제 하지 않을 것이라고 말하지 않습니다. mculp가 원하는 것은 나를 위해 작동합니다.
innaM

@janko, 사실, git은 나를 위해 완전히 빈 디렉토리를 제거하지 못했습니다.
Acumenus 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.