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

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

다음을 발행했습니다.

git remote update
git checkout HEAD
git pull origin HEAD

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

두 가지 질문 :

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



답변

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


답변

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

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


답변

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

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

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

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

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


답변

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

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

git clean -fd -x

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

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


답변

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

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

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

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

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


답변