git 폴더의 크기를 줄이는 방법이 있습니까?


156

내 프로젝트가 모든 자식마다 점점 커지고있는 것처럼 보입니다 commit/push. 내 자식 폴더를 정리하는 방법이 있습니까?

답변:


214

당신이 원하는 것이 확실하지 않습니다. 우선 커밋 / 푸시 할 때마다 디렉토리는 추가 커밋을 각각 저장해야하기 때문에 디렉토리가 약간 커집니다.

그러나 git gc"불필요한 파일을 정리하고 로컬 리포지토리를 최적화합니다"( 매뉴얼 페이지 ) 를 원할 것 입니다.

다른 관련 명령은 트리에서 추적되지 않은 파일을 삭제git clean 하는 것 입니다 ( manual page ).


30
git clean -d -f -x는 .gitignore 등에 나열된 파일을 삭제합니다. 예 : git, Pods 폴더 등에 속하지 않은 작업 공간
Kalle

102
WARNING@Kalle 이상 작성된 명령은 제거 EVERY >의 비 추적 <파일 및 디렉토리를 당신의 GIT ROOT 이내에 , 아니 그냥 "파일을 .gitignore에 나와". Git이 목록에 있는지 여부에 관계없이 추적하지 않는 것은 .gitignore지워집니다. git clean -dfX(의 경우 참고 X)에의 규칙이 적용되는 항목 만 제거됩니다 .gitignore. 이 경고에 유의하십시오. 대화식 모드에서을 (를) 대신 실행하거나 최소한 드라 이런을 먼저 수행 한 다음으로 다시 실행 git clean하지 마십시오 . -i-f-n-f
Adrian Günter

5
또는 백업 :-) 만들기
Mateen Ulhaq

61

운영:

git remote prune origin

에서 이미 제거 origin되었지만 에서 로컬로 여전히 사용 가능한 모든 부실 추적 분기를 삭제합니다 remotes/origin.

git gc --auto

' G arbage의 C의 ollection'- 실행 가사 작업 (찜질 개정 제거합니다은 / 액세스 개체를 풀어). --auto플래그는 먼저 어떤 작업이 필요한지 여부를 결정하고, 그렇지 않으면 아무것도하지 않고 종료합니다.


4
그 일에 대한 설명이 있습니까? Google에서 Google 문서를 검색하고 문서를 검색 할 수 있지만 코드 나 명령 만 포함 된 경우 답변에 대한 간단한 설명을 제공하는 것이 일반적입니다.
Dzhuneyt

28

커밋마다 git repo가 심각하게 커지는 시나리오 는 정기적으로 생성하는 바이너리 파일을 커밋하는 시나리오 입니다. 그들의 저장 공간은 텍스트 파일보다 효율적이지 않습니다 .

또 다른 당신이 내 파일의 거대한 숫자를 하나 하나 (A입니다 REPO 자식의 한계 (대신 여러 subrepos의) 서브 모듈로 관리 ).

git space에 대한기사에서 AlBlue는 다음과 같이 언급합니다.

Git (및 Hg 및 기타 DVCS)은 (큰) 바이너리가 체크인 된 다음 삭제되는 문제로 어려움을 겪습니다. 현재 저장소가 아닌 경우에도 저장소에 표시되고 공간을 차지합니다. .

git repo에 큰 바이너리가 저장되어 있다면 다음을 고려할 수 있습니다.

내가에서 언급 한 바와 같이 " 무슨 망할 놈의 파일 제한 (개수 및 크기)?이다 더 최근"(2015 년이 답변 후 5 년) 힘내 LFS GitHub의에서 그들을 저장하여 (그 큰 파일을 관리 할 수있는 방법입니다 외부 Git 저장소).


1
git large file support는 이미지와 같은 큰 바이너리 파일이 정기적으로 추가 / 업데이트되는 경우 유용합니다. git-lfs.github.com을 참조하십시오 . 구현하기 쉽고 github에서 지원합니다. 모든 팀 구성원이 공동으로 사용하려면 설치해야합니다.
Eric Woods

@EricWoods 사실. 전에 Git-LFS를 언급했습니다 (64 회 : stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). 이에 따라이 오래된 답변을 편집했습니다.
VonC

하, 정말로! 9 년 이상 된 답변이 여전히 관련성이있는 방법이 재미 있습니다.
Eric Woods

22

git gc, 자연스럽게 해결책입니다.

로컬-로컬 저장소를 삭제하고 다시 복제 할 수 있습니다.

그러나 여기에 더 중요한 것이 있습니다 ...

거대한 git & externals가 처리 될 때까지 기다리는 시간 (초)은 몇 분 동안 비효율적 인 시간으로 수집됩니다.

새로 만들기 (전체뿐만 아니라 지점) 처음부터 저장소 파일의 유일한 최신 버전을 포함하여, 자연스럽게 모든 역사를 잃어 버릴 것이다,

그러나 코드 세계에서 감상적이 될 때가 아닌 경우, 모든 커밋 또는 diff마다 5 년 동안의 코드 전체를 끌고 다니는 지점이 없습니다. 그리워하는 경우 오래된 git & externals를 어딘가에 저장할 수 있습니다 :]

그러나 어느 시점에서 당신은 정말로 따라 움직여야합니다 :]

당신의 팀은 당신을 감사합니다!


12
우리는 최근이 저장소를 구식 저장소로 가져 왔으며 되돌아 보지 않았습니다. 글쎄, 주로 우리가 할 수 없기 때문에, 당신은 내가 무엇을 의미하는지 안다 :)
WhatIsHeDoing

13

이 명령을 실행하는 것은 매우 위험하지만 모든 git 복구 / 백업 파일을 지우면 리포지토리가 축소됩니다.

git reflog expire --expire=now --all && git gc --prune=now --aggressive

git이 나쁜 명령에서 저장소를 복구하는 데 사용하는 모든 파일을 지 웁니다 (예 : 수행 한 경우 git reset --hard일반적으로 손실 된 파일을 복구 할 수 있음). 그러나 명령을 git reset --hard내리기 전에 git reflog expire...모든 것을 잃어 버렸습니다. 이제 유일한 희망은 파일 시스템을 분석하고 지워지지 않은 파일이 재정의되지 않은 경우 복구하려고 시도하는 도구를 사용하는 것입니다.


3
나는 이것을 이것을 매우 위험한 것으로 부르지 않을 것 입니다. 난 당신이 조심 해야 할 부분에 라벨을 붙 였습니다. 내 경험상, 실제로는 참조 나 접근 할 수없는 물건을 만지는 사람은 거의 없다. 대부분은 그들이 존재하거나 그것들과 상호 작용하는 방법조차 알지 못하기 때문에 그들이 유용 할 상황에 처하게되거나 끔찍하게 일을한다 비효율적 인 방법. 나는 당신이이 명령들이 무엇을하는지 알 수없고 이해할 수 없다면, 안전하게 실행할 수 있다고 말할 것입니다!
Chris Morgan

10

git clean -d -f -i 가장 좋은 방법입니다.

보다 통제 된 방식으로 청소하는 데 도움이됩니다.

-i 대화식을 나타냅니다.


3
OP의 질문은 모호하고 이것이 그 점에서 좋은 대답이지만 git clean디렉토리를 정리하는 것만 큼 저장소를 정리하기위한 것이 아니라고 지적하고 싶습니다 . 맹목적으로 복사 / 붙여 넣기를하는 사용자는주의하십시오. 이렇게하면 실제로 로컬에서 원하는 추적되지 않은 파일 / 디렉토리가 제거됩니다.
sraboy

git clean -d -x -f 딥 클린을 원한다면 잘 작동합니다
Rishabh Jain

2

그것이 축소되는지 알지 못하지만 실행 한 후에도 git clean종종 수행 git repack -ad하므로 팩 파일 수가 줄어 듭니다.


5
리 패킹은 git gc프로세스 의 일부 이므로 별도로 실행할 필요가 없습니다
artkoshelev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.