빈 디렉토리를 Git 저장소에 추가하려면 어떻게해야합니까?


4263

파일이없는 빈 디렉토리를 Git 저장소에 어떻게 추가 할 수 있습니까?


16
유용하지는 않지만 빈 디렉토리를 해킹하는 방법이 있습니다 . checkout그러나 현재 버전의 Git에는 포함 되지 않습니다 .
tiwo

335
@tiwo 나는 그것이 유용하지 않다는 것에 동의하지 않는다. 디렉토리 계층은 프로젝트의 일부이므로 버전을 제어해야합니다.
JBentley

114
필자의 경우 tmp 파일 자체의 디렉토리 구조를 추가하고 싶지는 않지만 tmp 파일의 디렉토리 구조를 추가하고 싶습니다. 이렇게하면 내 테스터가 올바른 구조를 갖지 만 (그렇지 않으면 오류가 있음) 커밋을 tmp 데이터로 막지 않습니다. 예, 유용합니다!
Adam Marshall

45
@AdamMarshall 나는 두 사람이 해킹이 유용하지 않다고 말한 것으로 생각합니다. Tmp 디렉터리는 VCS에 유용한 기능처럼 들립니다.
Quantum7

31
tmp 파일을 작성하는 프로 시저가 tmp 디렉토리도 작성하지 않는 이유는 무엇입니까?
RyPeck

답변:


4125

디렉토리를 (거의) 빈 상태로 유지하는 또 다른 방법 .gitignore은 다음 네 줄을 포함 하는 파일을 해당 디렉토리 내에 작성하는 것입니다 .

# Ignore everything in this directory
*
# Except this file
!.gitignore

그런 다음 m104의 솔루션 에서해야 할 방식으로 주문을받을 필요가 없습니다 .

또한 git 상태를 수행 할 때 해당 디렉토리의 파일이 "추적되지 않은"것으로 표시되지 않는 이점도 있습니다.

@GreenAsJade 의 의견을 지속적으로 만들기 :

이 솔루션이 질문에서 요구 한 것을 정확하게 수행한다는 점은 주목할 가치가 있지만 아마도이 질문을 보는 많은 사람들이 찾고있는 것은 아닐 것입니다. 이 솔루션은 디렉토리가 비어 있도록 보장합니다. "진짜로 파일을 체크인하고 싶지 않습니다"라고 말합니다. "여기에 체크인 할 파일이 없지만 여기에 디렉토리가 필요합니다. 파일이 나중에 올 수 있습니다".


25
@JohnMee가 제안한 README 솔루션을이 솔루션과 함께 사용해야한다고 생각합니다. .gitignore 파일은 우리가 버전 관리를 막고 자하는 것에 대한 설명을 제공하는 반면, README 파일은 디렉토리의 목적이 무엇인지 설명하며,이 둘은 매우 중요한 정보입니다.
pedromanoel

18
@pedromanoel 나는 파일 README안에 넣을 문서를 의견으로 쓴다 .gitignore.
Carlos Campderrós

69
1) 빈 폴더, 2.) .gitignore 파일이 들어있는 폴더. ;-)
Peter Perháč

6
이에 적합 캐시 폴더.
redolent

10
불행히도 이로 인해 비어 있지 않은 디렉토리가 생겨 단일 숨겨진 파일이 있습니다.
pedorro

1090

당신은 할 수 없습니다. 힘내 FAQ를 참조하십시오 .

현재 git index (스테이징 영역)의 디자인은 파일을 나열하는 것만 허용하며 빈 디렉토리를 허용하도록 변경 할만 큼 유능한 사람은 아무도이 상황을 해결하기에 충분하지 않았습니다.

디렉토리는 파일을 추가 할 때 자동으로 추가됩니다. 즉, 디렉토리를 저장소에 추가 할 필요가 없으며 자체적으로 추적되지 않습니다.

" git add <dir>" 라고 말하면 거기에 파일이 추가됩니다.

체크 아웃에 디렉토리가 실제로 필요한 경우 파일을 작성해야합니다. .gitignore는이 목적에 적합합니다. 비워 두거나 디렉토리에 표시 될 파일 이름을 채울 수 있습니다.


67
아래 답변이 훨씬 좋습니다. 저수준 소프트웨어를 git이 허용하지 않는다는 사실은 빈 디렉토리가 필요할 때 실제로 Git을 사용하는 방법만큼 중요하지 않습니다. 2 줄 .gitignore를 추가하면 나에게 허용되는 것 같습니다.
Amala

1
만약 파일을 새로운 디렉토리로 옮기고 싶다면, git mvgit은 새로운 디렉토리가 버전 관리하에 있지 않다고 불평 할
것이므로

16
이 빈번한 질문에 대해 인터넷을 통해 " 불가능, 불가능 등 "을 읽을 수 있습니다 . .gitignore트릭은 자주 대답, 만족 많은 요구를. 그러나 가능하다 추적 GIT하기 위해 진정으로 비어있는 디렉토리를 내 대답을 참조
ofavre

2
더 내가 생각하지만, 더는 존재하는 경우, 실제로, "빈 문자열의 SHA 해시"같은 느낌 은 그 객체인지 여부를 말할 불가능하지 않는 한, 빈 나무에 잘 정의 된 식별자 나무 또는 얼룩.
Emil Lundberg

21
.gitkeep이 목적으로 불리는 빈 파일을 사용하는 많은 저장소를 보았습니다 .
Sukima

759

.gitkeep디렉토리에서 빈 파일을 작성 하고 추가하십시오.


58
대신 만들도록 격려 하는 답변 을 추가했습니다 .keep.
Acumenus

205
.gitkeepGit에 의해 처방되지 않았으며 사람들이 그 의미를 다시 추측하게하여 Google 검색으로 연결되어 여기로 연결됩니다. 그만큼.git접두사 규칙은 힘내 자체가 사용하는 파일과 디렉토리에 예약해야합니다.
t-mart

10
@ t-mart " .git접두사 규약을 예약해야합니다 ..."왜? git가이 예약을 요청합니까?
제한 속죄

9
이 경우 a README또는 ABOUT파일이 좋거나 좋습니다. 우리가 URL보다 먼저 사용했던 것처럼 다음 사람에게 메모를 남깁니다.
Dave

5
빈 디렉토리에서 코드를 테스트해야하는 단위 테스트를 작성하는 경우 작동하지 않습니다 ...
thebjorn

436

리포지토리에서이 디렉터리를 원하는 이유 (비어있는 경우)에 대한 설명과 함께 항상 README 파일을 디렉터리에 넣을 수 있습니다.


39
+1, 좋은 제안, 빈 디렉토리는 나중에 사용하지 않는 한 의미가 없습니다. 그 안에 README 파일을 작성하고이 디렉토리의 용도와 향후 어떤 파일을 넣을 것인지 작성하십시오. 두 가지 문제를 모두 해결합니다.
saeedgnu

63
@ilius 넌센스. 빈 디렉토리를 포함하는 디렉토리 구조는 모델 디렉토리를 원하지만 아직 모델을 작성하지 않은 MVC 앱 또는 나중에 공유 뷰를 추가하려는 공유 뷰 디렉토리와 같은 많은 상황에서 매우 바람직 할 수 있습니다. ). 또한, 이들 각각에 README를 넣는 것은 그것이 무엇인지 분명하기 때문에 과잉이며, 각각에 README를 넣는 것을 잊어 버릴 수 있습니다. 그리고 다른 파일을 추가 할 때 README를 제거해야합니다. 기본적으로 git은 빈 디렉토리를 허용해야합니다.
Jez

20
@Jez : 동의하지 않습니다. 요점은 git이 소스 코드를 제어하고 색인하도록 설계되었다는 것입니다. 중요한 것은 커밋의 ID는 내용의 해시입니다. 즉, 내용이 있어야합니다. 트리의 모든 부분에 README가 필요하지 않으며 리프 노드 만 있습니다. 코드를 넣을 곳이 있지만 코드가없는 곳이 있고 "모델을위한 장소">> README를 반향하는 데 시간이 걸리지 않는다면 당신이 가진 것은 커밋이 아닙니다. 자식에 관심이 없습니다. "실행중인 앱에 XYZ에 빈 디렉토리가 있어야 함"이라고 말하는 것은 소스 문제 가 아니라 런타임 문제입니다. 설치 프로그램으로 처리하십시오.
Joe Atzberger

6
@JoeAtzberger 의도적 인 제한이 아닌 누락 된 기능입니다. Git FAQ에서 : 현재 Git 인덱스 (스테이징 영역)의 디자인은 파일 만 나열 할 수 있으며, 빈 디렉토리를 허용하도록 변경을 수행 할 수있는 권한을 가진 사람은 아무도이 상황을 해결하기에 충분하지 않습니다.
jbo5112 2016 년

7
@ jbo5112 네, "특별 코드"는 제가 언급 한 "설치자"입니다. webapp 설치는 이미 데이터베이스 생성, 로컬 구성, 의존성 풀기 또는 100 가지 다른 작업을 처리해야하지만 빈 디렉토리가 몇 개 있습니까? gradle, passenger, chef, primitive Makefile 등을 사용해보십시오. 디렉토리를 만드는 것과 앱을 설치하는 다른 (잠재적으로 더 복잡하고 위험한) 작업에는 보안상의 차이가 없습니다. 그리고 실제로 dep, config, DB 등이없고 설치 프로그램이 없다면 README를 사용하십시오. 두 경우 모두 필요한 경우는 없습니다.
Joe Atzberger 2018 년

348
touch .keep

Linux에서는이라는 빈 파일이 생성됩니다 .keep. 가치가있는 것으로,이 이름은 Git에 독립적이며 .gitkeepGit에만 해당됩니다. 둘째, 다른 사용자가 언급했듯이 .git접두사 규칙은 Git 자체가 사용하는 파일과 디렉토리를 위해 예약되어야합니다.

또는 다른 답변 에서 언급했듯이 디렉토리에는 설명 README이나 README.md파일이 대신 포함될 수 있습니다 .

물론 파일이 존재하더라도 응용 프로그램이 중단되지 않아야합니다.


1
초기 베어 디렉토리에는 좋지만 파일로 채워지기 시작하면 어떻게됩니까? 그런 다음 Git은이를 확인하고 추적되지 않은 파일로 주장합니다. 여기서 선택한 답변은 훨씬 우아하게 작동하여 디렉토리를 유지하면서 내용을 무시합니다.
JakeGould

14
질문과 주된 일반적인 관심사는 빈 디렉토리를 추가하는 것입니다. 나중에 상주 파일이 있으면 파일을 삭제 .keep하거나 무시하십시오. 대신 디렉토리의 파일을 무시해야한다면 전혀 다른 질문입니다.
Acumenus

3
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"추적되지 않은 모든 빈 디렉토리에서이 작업을 수행 하는 것이 좋습니다 .
Acumenus

1
이 솔루션이 마음에 들지 않으면이 파일의 기능을 추측하기가 어렵습니다. 또한 개발 환경에서 파일 (예 : 로그 또는 이미지 등)을 생성하는 경우 해당 파일의 버전이 유지되지 않고 프로덕션 환경으로 전환되지 않으므로 좋지 않습니다.
danielrvt

1
Windows는 이름이없는 파일을 좋아하지 않으며 이것을 달성하기 위해 특별한 마법이 필요합니다 (일명 bash와 같은 터미널 응용 프로그램 또는 이와 동등한 것).
EntangledLoops

303

빈 버전의 폴더가 필요한 이유

먼저 첫 번째 것들:

빈 디렉토리 는 Git 버전 관리 시스템에서 트리의 일부가 될 수 없습니다 .

단순히 추적되지 않습니다. 그러나 빈 버전의 "버전 관리"가 의미가있는 시나리오가 있습니다. 예를 들면 다음과 같습니다.

  • 미리 정의 된 폴더 구조를 스캐 폴딩 하여 리포지토리의 모든 사용자 / 기여자가 사용할 수 있도록합니다. 또는 위의 특수한 경우로서, 폴더 를 제공하지만 그 내용 을 제공하려는 임시 디렉토리 ( 예 : cache/또는 logs/디렉토리)를위한 폴더 생성.gitignore
  • 위와 관련하여 일부 프로젝트 는 일부 폴더가 없으면 작동하지 않습니다 (종종 잘못 설계 된 프로젝트의 힌트이지만 실제 시나리오는 빈번하며 권한 문제가 해결 될 수 있습니다).

몇 가지 제안 된 해결 방법

많은 사용자들이 제안합니다 :

  1. README디렉토리를 비우기 위해 파일 또는 다른 파일에 일부 내용 배치
  2. 만들기 .gitignore"역 논리"의 일종으로 파일을 끝에서, 방법 # 1의 동일한 목적을 수행하는 (즉 모든 파일을 포함합니다).

두 솔루션모두 작동 하지만 Git 버전 관리에 대한 의미있는 접근 방식과 일치하지 않습니다.

  • 왜 프로젝트에서 원하지 않는 가짜 파일이나 README를 넣어야합니까?
  • 가능하지만 파일을 제외하고 의도 한 것과 반대 .gitignore되는 일 ( 파일 유지 )을 사용 하는 이유 는 무엇 입니까?

.gitkeep 접근 방식

버전 관리 시스템에 폴더가 존재하도록하려면 파일을 사용하십시오 .gitkeep.

그렇게 큰 차이는 아니지만 보일 수 있습니다.

  • 폴더를 유지하기위한 단일 목적의 파일을 사용 합니다. 당신은 당신이 넣고 싶지 않은 정보를 넣지 않습니다.

    예를 들어, README와 폴더를 유지하는 데 대한 변명이 아니라 유용한 정보가있는 README를 사용해야합니다.

    우려의 분리는 항상 좋은 일이며 .gitignore원치 않는 파일을 무시 하기 위해를 추가 할 수 있습니다.

  • 이름을 지정 .gitkeep하면 파일 이름 자체 (그리고 공유 프로젝트 및 Git 저장소의 핵심 목적 중 하나 인 다른 개발자 에게도 ) 에서이 파일이 매우 명확하고 간단 합니다.

    • 코드와 관련이없는 파일 (앞의 점과 이름으로 인해)
    • Git과 관련된 파일
    • 그것의 목적 ( 계속 )은 명확하게 언급되고 일관성 있고 의미 적으로 무시 한다는 의미에서 반대된다

양자

Laravel , Angular-CLI.gitkeep 와 같은 매우 중요한 프레임 워크에서 채택 된 접근 방식을 보았습니다 .


8
한 가지 생각을 놓쳤습니다. 폴더를 유지하고 비우는 이유는 무엇입니까 (예 : / logs, / tmp, / uploads)? 예-폴더를 비우는 것입니다. :) 따라서 폴더를 비우려면 폴더 안의 파일을 무시해야합니다.
Roman

14
@RomanAllenstein : 반드시 그런 것은 아닙니다. 주어진 구조로 나중에 리포지토리를 생성 할 수 있습니다. 해당 파일은 생성되는 즉시 저장소에 추가되며 .gitignore 파일 삭제 또는 편집을 시작하기가 성 가실 것입니다. )
blueFast

45
@Behnam : Downvote를 사용하지만 SO 메타에 대한 나의 연구는 모든 독자 (및 모든 기술 수준)에 유용 할 정도로 상세하고 명확성을 제공하는 한 자세한 답변에 대한 관심을 보이지 않습니다. 여전히 나는 어떤 비판에도 매우 개방적이며 그 이유를 공개적으로 선언 해 주셔서 감사합니다. 매우 긍정적으로 생각합니다.
Cranio

4
.gitkeepgit-prefixed가 아닌 다른 파일 이름 으로 대체하기 위해 답을 편집하면 내 의견을 얻습니다.이 정보가 가장 유익하고 유익한 답변이라고 생각합니다. 이유 : ".git *"는 git 규정 파일 용으로 예약해야한다고 생각하지만 이것은 단순한 자리 표시 자일뿐입니다. 내가 본 첫 번째 추측은 예를 들어 ".gitkeep"파일은 자동 무시되지만 (좋은 기능이 될 것입니다) 그렇지 않습니다.
Johnny

5
왜 사람들이 왜 "빈"폴더를 git에 추가하고 싶어하는지 이해하기 어려운 이유가 궁금합니다. 어딘가에서 시작해야합니까? 따라서 일반적으로 프로젝트 폴더 구조로 시작하고 프로젝트 시작시 아직 아무것도 없습니다. 프로젝트 리포지토리가 완료되면 팀 작업자는 SAME 구조를 복제하고 작업을 시작할 수 있습니다.
BitTickler

127

다른 답변에서 설명했듯이 Git은 준비 영역에서 빈 디렉토리를 나타낼 수 없습니다. ( Git FAQ를 참조하십시오 .) 그러나 .gitignore파일 이 들어있는 디렉토리가 비어있는 경우 다음을 .gitignore통해서만 빈 디렉토리에 파일을 만들 수 있습니다 .

find . -type d -empty -exec touch {}/.gitignore \;

21
.git 디렉토리를 무시하고 싶을 수도 있습니다 : find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
steffen

3
대부분의 상황에서 가장 간단한 변형은find * -type d -empty -exec touch {}/.gitignore \;
akhan

2
OS X은 거의 모든 directoy에 .DS_Store 파일을 작성하므로 작동하지 않습니다. 내가 찾은 유일한 (DANGEROUS!) 해결 방법은 먼저 모든 .DS_Store 파일을 삭제 find . -name .DS_Store -exec rm {} \;한 다음이 답변에서 선호하는 변형을 사용하는 것입니다. 올바른 폴더에서만 실행하십시오!
zerweck

1
누구나 Windows에서 명령 줄을 통해이 작업을 수행하는 방법을 알고 있습니까? 루비와 파이썬에서 몇 가지 솔루션을 보았지만 관리가 가능하면 베어 본 솔루션을 원합니다.
Mig82

1
@akhan 무언가를 추가 하면 명령 플래그에 .gitignore영향을 미치지 않습니다 . 내 의견은 디렉토리 트리에서 파일을 제거하는 것이므로 플래그를 적용 할 수 있습니다. -emptyfind.DS_Store-empty
zerweck

68

앤디 레스터는 잘하지만, 디렉토리 그냥 비어, 그리고 할 필요가있는 경우 비워 빈, 비어있는 넣을 수 있습니다 .gitignore해결 방법으로 거기에 파일을.

제쳐두고 이것은 기본적인 Git 스토리지 디자인 문제가 아니라 구현 문제입니다. Git 메일 링리스트에서 여러 번 언급 한 것처럼, 이것이 구현되지 않은 이유는 패치를 제출할 수있는 사람이 아무도 없었기 때문입니다.


4
바로 내가 말한 것입니다. 두 단락 모두 내가 게시 한 FAQ의 일부에서 설명합니다.
Andy Lester

1
제쳐두고 제쳐두고 이해하는 것이 유용하다고 생각합니다. 수정이 가능합니다. 대부분의 경우에 쉬운 해결책이있을 때 곧바로 기대하지 마십시오.
wnoise

죄송합니다. 마지막 단락을 읽지 않았고 첫 번째 단락을 읽었지만 왜 그 정보를 반복했는지 잘 모르겠습니다.
아리스토텔레스 Pagaltzis

2
물론이 추가 답변은 사실을 지적하는 역할을합니다.
마이클 존슨

디렉토리가 존재하지 않고 기본적으로 비어 있으면 빌드가 다운 된 경우를 보았습니다. 그러나 비어있을 필요는 없습니다. gitignore를 만들면 올바른 일을합니다.
Joshua

33

레일에 루비 생성 방법 폴더 로그인 :

mkdir log && touch log/.gitkeep && git add log/.gitkeep

이제 로그 디렉토리가 트리에 포함됩니다. 배포 할 때 매우 유용하므로 로그 디렉토리를 만들기 위해 루틴을 작성할 필요가 없습니다.

로그 파일은 발행하여 보관할 수 있습니다.

echo log/dev.log >> .gitignore

그러나 당신은 아마 그것을 알고 있었다.


23
Ruby on Rails와 어떤 관련이 있습니까?
Quolonel 질문


30

힘내는 빈 디렉토리를 추적하지 않습니다. 자세한 설명 은 Git FAQ 를 참조하십시오 . 제안 된 해결 방법은 .gitignore파일을 빈 디렉토리에 넣는 것 입니다. 그 솔루션을 좋아하지 않기 때문에.gitignore유닉스 컨벤션에 의해 "숨겨져" . 또한 디렉토리가 비어있는 이유에 대한 설명이 없습니다.

디렉토리가 비어있는 이유와 Git에서 추적 해야하는 이유를 설명하는 빈 디렉토리에 README 파일을 넣는 것이 좋습니다. README 파일이 있으면 Git에 관한 한 디렉토리가 더 이상 비어 있지 않습니다.

진짜 질문은 왜 git에 빈 디렉토리가 필요합니까? 일반적으로 컴파일 / 실행하기 전에 빈 디렉토리를 만들 수있는 일종의 빌드 스크립트가 있습니다. 그렇지 않다면 하나 만드십시오. 빈 디렉토리를 git에 넣는 것보다 훨씬 나은 솔루션입니다.

따라서 git에 빈 디렉토리가 필요한 이유가 있습니다. 그 이유를 README 파일에 넣으십시오. 이렇게하면 다른 개발자 (및 미래의 사용자)가 빈 디렉토리가 필요한 이유를 알 수 있습니다. 빈 디렉토리가 필요한 문제가 해결되면 빈 디렉토리를 제거 할 수도 있습니다.


빈 디렉토리를 모두 나열하려면 다음 명령을 사용하십시오.

find -name .git -prune -o -type d -empty -print

빈 디렉토리마다 자리 표시 자 README를 만들려면

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

README 파일을 제외한 디렉토리의 모든 것을 무시하려면 다음 행을 다음에 입력하십시오 .gitignore.

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

또는 모든 README 파일이 무시되지 않도록 제외시킬 수 있습니다 .

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

모든 README가 이미 작성된 후 나열하려면 다음을 수행하십시오.

find -name README.emptydir

28

경고 :이 조정은 실제로 작동하지 않습니다. 불편을 드려 죄송합니다.

아래의 원본 게시물 :

Git 내장을 가지고 노는 동안 해결책을 찾았습니다!

  1. 저장소에 있다고 가정하십시오.
  2. 빈 디렉토리를 만듭니다.

    $ mkdir path/to/empty-folder
    
  3. 배관 명령과 빈 트리 SHA-1을 사용하여 색인에 추가하십시오 .

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder
    

    명령을 입력 한 후 두 번째 줄을 입력하십시오. 를 누른 Enter다음 Ctrl+ D를 눌러 입력을 종료하십시오. 참고 : 형식은 모드 [SPACE] 유형 [SPACE] SHA-1hash [TAB] 경로입니다 (탭이 중요합니다. 응답 형식은이를 유지하지 않습니다).

  4. 그게 다야! 빈 폴더가 색인에 있습니다. 커밋 만하면됩니다.

이 솔루션은 짧고 분명히 잘 작동합니다 ( EDIT! 참조 ). 그러나 기억하기 쉽지 않습니다 ...

빈 트리 SHA-1은 새로운 빈 Git 리포지토리를 생성 하고 빈 트리 SHA-1을 출력하는 cd이슈를 발행 하여 찾을 수 있습니다 git write-tree.

편집하다:

이 솔루션을 찾은 이후로 사용하고 있습니다. 어디에도 모듈이 정의되어 있지 않다는 점을 제외하면 하위 모듈을 만드는 것과 정확히 같은 방식으로 작동합니다. 발급시 오류가 발생 git submodule init|update합니다. 문제는 부분을로 git update-index다시 작성 한다는 것 입니다.040000 tree160000 commit

또한 Git는 해당 경로 아래에있는 파일을 다른 저장소에 속한다고 생각하지 않습니다. 쉽게 간과 될 수 있으므로 불쾌합니다!

그러나 저장소에서 Git 하위 모듈을 아직 사용하지 않고 사용하지 않는 경우 "empty"폴더는 비어 있거나 Git이 해당 내용을 알고 내용을 무시하도록하려면 이 조정. 서브 모듈을 사용하여 일반적인 방법으로 이동하면 더 많은 단계가 필요합니다.


빈 폴더를 색인에 넣고 커밋 한 후에 git svn dcommit원하는 결과를 얻을 수 있습니까?
제한 속죄

2
이 조정이 다른 도구와 함께 작동하지는 않습니다. 경고 및 편집에 명시된 바와 같이, 매우 제한된 경우를 제외하고는 사용하지 않는 것이 좋습니다.
ofavre

1
물론 이것이 git internals을 망쳐 놓는 것이 금기입니다.
Casey

@abhisekp 어떻게 가능합니까?
PyRulez

1
@PyRulez는 소프트웨어 세계에서는 불가능한 것이 없습니다. : D 사실, 나는 그 대답을 따랐다.
abhisekp

21

tmp 라는 빈 디렉토리가 필요하다고 가정 해 봅시다 .

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

다시 말해, Git에게이를 무시하도록 지시하기 전에 .gitignore 파일을 인덱스에 추가해야합니다 (빈 디렉토리의 다른 모든 것).


11
두 가지 : 터치하지 않고 "echo '*'> tmp / .gitignore"를 사용할 수 있으며 "git commit -m"은 파일을 색인에 추가 한 후에 수행 된 변경 사항을 커밋하지 않습니다.
Christoffer Hammarström

6
당신은 그냥 할 경우 echo bla > file당신은받지 않습니다 file: File exists때문에 >이미있을 경우 파일을 덮어 쓰기하거나 존재하지 않을 경우 새 번호를 생성합니다.
psyrendust

3
/bin/sh문화적 가정! * "여기"가 csh있고 변수 noclobber가 설정되면 실제로 얻을 수 file: File exists있습니다. 누군가가 "이것을 얻습니다"라고 말하는 경우, 그들이 바보라고 가정하지 말고 "아니요"라고 대답하십시오. * c2.com/cgi/wiki?AmericanCulturalAssumption
clacke

1
@clacke 누군가 다른 사람과 다른 쉘을 사용하기로 결정한 경우, 문제가 발생하면이를 명시 적으로 언급해야합니다. 국적과는 달리, 모든 사람들은 자유로운 선택의 껍질을 가지고 있습니다.
SeldomNeedy

2
@SeldomNeedy 어쩌면 그들은 다른 사람들과 다른 쉘을 사용하고 있다는 사실조차 모르기 때문에 도움을 찾고있을 것입니다.
clacke

20

빈 디렉토리를 추가하면 해당 디렉토리가 존재할 것으로 예상되는 스크립트가 있기 때문에 가장 저항이 적은 경로 인 것 같습니다 (아마 생성 된 바이너리의 대상 일 수 있음). 또 다른 방법은 스크립트수정하여 필요에 따라 디렉토리를 작성하는 것 입니다.

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

이 예에서는 ".generated"접두사없이 액세스 할 수 있도록 디렉토리에 (깨진) 기호 링크를 체크인 할 수 있습니다 (그러나 이것은 선택적입니다).

ln -sf .generated/bin bin
git add bin

소스 트리를 정리하려면 다음을 수행하십시오.

rm -rf .generated ## this should be in a "clean" script or in a makefile

거의 비어있는 폴더를 체크인하는 데 자주 제안되는 방식을 사용하는 경우 ".gitignore"파일을 삭제하지 않고 내용을 삭제하는 것이 약간 복잡합니다.

루트 .gitignore에 다음을 추가하여 생성 된 모든 파일을 무시할 수 있습니다.

.generated

1
참고 : 제안한 기호 링크는 .generated처음에 디렉토리가 존재하지 않기 때문에 클린 체크 아웃에서 "깨졌습니다" . 빌드를 한 후에는 더 이상 손상되지 않습니다.
nobar

2
어떤 경우에는 이것이 매우 좋은 아이디어이지만 다른 경우 (예 : 모델 / 및 뷰 /와 같은 폴더가있는 빈 골격이있는 프로젝트 배포와 같은) 사용자는 이러한 디렉토리를 갖기를 원할 것입니다 수동으로 문서를 읽어야하는 것보다 repo를 복제 한 후 일종의 설치 스크립트를 실행할 것으로 기대할 수 있습니다. 나는이 답변을 @ john-mee의 README 답변과 함께 사용하여 모든 경우를 다룰 수 있다고 생각합니다.
moopet

14

빈 디렉토리에서도 문제가 발생했습니다. 플레이스 홀더 파일을 사용할 때의 문제점은 나중에 필요하지 않은 파일을 작성하고 삭제해야한다는 것입니다 (나중에 서브 디렉토리 나 파일이 추가 되었기 때문에이 플레이스 홀더 파일을 관리하는 큰 소스 트리를 사용하면 번거롭고 오류가 발생할 수 있습니다) 경향이 있습니다.

이런 이유로 저는 이러한 자리 표시 자 파일의 생성 / 삭제를 자동으로 관리 할 수있는 오픈 소스 도구를 작성하기로 결정했습니다. .NET 플랫폼 용으로 작성되었으며 Mono (Linux 용 .NET) 및 Windows에서 실행됩니다.

http://code.google.com/p/markemptydirs를 살펴보십시오 .


14

나는 @ Artur79와 @mjs의 답변을 좋아하므로 두 가지 조합을 사용하여 프로젝트의 표준으로 만들었습니다.

find . -type d -empty -exec touch {}/.gitkeep \;

그러나 소수의 개발자 만 Mac 또는 Linux에서 작업합니다. Windows에서 많은 작업을 수행했으며 거기에서 동일한 작업을 수행하는 동등한 간단한 단일 라이너를 찾을 수 없었습니다. 일부는 다른 이유로 Cygwin을 설치하기에 운이 좋았지 만 Cygwin을 처방하는 것은 과도한 것으로 보였습니다.

더 나은 솔루션을 위해 편집

따라서 대부분의 개발자가 이미 Ant를 설치했기 때문에 플랫폼을 독립적으로 수행하기 위해 Ant 빌드 파일을 구성하는 것이 가장 먼저 생각되었습니다. 이것은 여전히 여기 에서 찾을 수 있습니다

그러나 나는 파이썬을 사용하여 다시 만들어 PyPI에 게시 된, 그래서 나중에, 작은 유틸리티 명령에이를 만들기 위해 더 나은 것이라고 생각 여기 . 간단히 다음을 실행하여 설치할 수 있습니다.

pip3 install gitkeep2

또한 .gitkeep파일을 재귀 적 으로 생성 및 제거 할 수 있으며 동료가 해당 디렉토리가 중요한 이유를 이해할 수 있도록 메시지를 파일에 추가 할 수도 있습니다. 이 마지막 비트는 보너스입니다. .gitkeep파일이 자체 문서화 될 수 있다면 좋을 것이라고 생각했습니다 .

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-directories in the specified path.
  -l, --let-go        Remove the .gitkeep files from the specified path.
  -e, --empty         Create empty .gitkeep files. This will ignore any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it's important to push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

도움이 되셨기를 바랍니다.


13

불행히도 결코 할 수 없을 것입니다. 이것은 Linus Torvald 자신이 내린 결정입니다. 그는 우리에게 좋은 것이 무엇인지 알고 있습니다.

내가 한 번 읽은 어딘가에 흠이 있습니다.

Re : Empty directory ..를 찾았 지만 다른 디렉토리 가있을 수 있습니다.

불행히도 해결 방법으로 살아야합니다.


1
나는 당신이 이것을 잘못된 주장의 예로 게시 한 것을 알고 있지만 링크를 추적하는 것에 반대하는 합리적인 이유 때문에 링크에 감사드립니다. ;-)
clacke

1
:이 답변은 참조 스레드에서 다음 게시물에서, 리누스 토발즈는 그는 그들이 디렉토리 추적을 추가 할 필요가있을 것으로 기대 말한다 때문에 일관성이 될 것으로 보인다 markmail.org/message/libip4vpvvxhyqbl을 . 실제로 그는 "빈 디렉토리 추적을위한 지원을 추가하는 패치를 환영 할 것"이라고 말했다.
Patrick M

패트릭, 그는 또한 "이디 오틱"이라는 단어를 사용합니다. 나는 그의 말이이 글의 사람들을 여기에서 다루고 있다고 생각한다. 그래서 나는 그가 스스로 Git에 "멍청한"것을 구현하지 않을 것이라고 생각한다.
user2334883

10

.gitignore파일 을 추가 할 때 (Git이 무시하고 싶은) 많은 양의 컨텐츠를 넣을 경우 *, 무시한 컨텐츠를 실수로 추가하지 않도록 별표만으로 한 줄을 추가 할 수 있습니다 .


9

Git이 디렉토리를 추적하도록하는 방법은 없으므로 Git이 추적 할 디렉토리 내에 플레이스 홀더 파일을 추가하는 것이 유일한 해결책입니다.

파일 이름을 지정하고 원하는 것을 포함 할 수 있지만 대부분의 사람들은 이름이 지정된 빈 파일을 사용합니다 .gitkeep(일부 사람들은 VCS-agnostic을 선호합니다 .keep).

접두사 . 는 파일을 숨겨진 파일로 표시합니다.

또 다른 아이디어는 README디렉토리가 사용될 대상을 설명 하는 파일 을 추가하는 것입니다.


8

언급했듯이 빈 디렉토리를 추가 할 수는 없지만 빈 .gitignore 파일을 모든 디렉토리에 추가하는 하나의 라이너가 있습니다.

ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

쉽게 액세스 할 수 있도록 이것을 Rakefile에 고정했습니다.


6
차라리find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Tino

8

Jamie Flournoy의 솔루션은 훌륭합니다. 다음은 약간 강화 된 버전입니다 .htaccess.

# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess

이 솔루션을 사용하면 빈 폴더, 예를 들어 커밋 할 수 있습니다 /log, /tmp또는 /cache및 폴더가 비어있을 것입니다.


2
그는 파일이 아닌 빈 디렉토리를 유지하려고합니다.
gvsrepins

2
그리고 나는 그것이 .htaccess를 유지할 것이라고 언급했다. 예 : 소프트웨어가 웹을 통해 액세스 할 수 없어야하는 로그 파일 용 디렉토리 (예 : oxid eshop)가있는 경우 디렉토리에 .htaccess가 있습니다. 위에서 언급 한 .gitignore를 폴더에 넣으면 .htaccess가 전송되지 않고 웹을 통해 폴더에 액세스 할 수 있습니다.
로마

버전 제어를받는 .htaccess 파일이 있으면 이미 버전 제어를받는 파일이있는 디렉토리입니다. 따라서 문제는 이미 해결되었습니다. .gitignore 파일은 관련이 없습니다.
Ponkadoodle

1
@Wallacoloo 당신이 옳은 질문과 관련하여, 파일이 유용하더라도 파일을 .htaccess로 보호 해야하는 것과 같은 업로드 디렉토리에 사용합니다. 로마인의 설명과 달리 .htaccess 파일은 ignore-rule에 의해 제외되어 커밋됩니다. [오래된 실, 나는 압니다]
David

7

나는 항상 원하는 폴더 구조를 확인하고 프로젝트 내에서 나를 위해 빌드하는 함수를 작성합니다. 빈 폴더가 프록시에 의해 Git에 유지되기 때문에이 문제를 해결합니다.

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

이것은 PHP에 있지만 대부분의 언어가 동일한 기능을 지원한다고 확신하며 폴더 생성은 응용 프로그램에서 처리하므로 폴더는 항상 존재합니다.


2
우리는 모두 같은 페이지에 있으므로 더 이상이 작업을 수행하지 않습니다. 시간 낭비 야. .gitkeep규칙은 훨씬 더 나은 방법입니다.
Mild Fuzz

이것이 어떻게 시간 낭비인지 알 수 없습니다. TEMPLATEPATH가 동적 일 때는 .gitkeep 솔루션을 사용할 수 없습니다. 그리고 비 동적 폴더 구조를 사용하더라도 디렉토리를 확인하는 좋은 솔루션 (예 : 권한 확인 및 파일 chmod)을 제거하는 대신 몇 가지 추가 작업을 추가해야합니다. 전역 .gitignore 내부에 디렉토리를 표시하는 방법을 추가하면 나에게 완벽합니다. #keep / path / to / dir 같은 것
Jochen Schultz

7

해킹이 있지만 작동하는 것은 재미 있습니다 (Git 2.2.1). @Teka가 제안한 것과 비슷하지만 기억하기 더 쉽습니다.

  • 모든 저장소에 하위 모듈 추가 ( git submodule add path_to_repo)
  • 폴더와 파일이 추가됩니다 .submodules. 변경을 커밋하십시오.
  • .submodules파일을 삭제 하고 변경 사항을 커밋하십시오.

이제 커밋이 체크 아웃 될 때 생성되는 디렉토리가 있습니다. 흥미로운 점은이 파일의 트리 객체의 내용을 보면 다음과 같은 결과를 얻을 수 있다는 것입니다.

치명적 : 유효한 개체 이름이 아닙니다. b64338b90b4209263b50244d18278c0999867193

향후 버전의 Git에서 작동을 멈출 수 있기 때문에 사용하지 않는 것이 좋습니다. 저장소가 손상 될 수 있습니다.


이것은 실제로 작동하지만 IntelliJ에서 지옥을 혼란스럽게 생각합니다 ... : |
rogerdpack

나는 다음과 같은 단점이없는 더 나은 솔루션을 만들었습니다 : stackoverflow.com/a/58543445/277882
ntninja

7

많은 사람들이 이미이 질문에 대답했습니다. 여기에 PowerShell 버전을 추가하기 만하면됩니다.

디렉토리에서 빈 폴더를 모두 찾으십시오.

거기에 빈 .gitkeep 파일 추가

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}

Nice.‌‌ ༼ ͡☉ ͜ʖ ͡☉ ༽
FiringSquadWitness

6

여러 시맨틱 디렉토리에 많은 임시 데이터를 저장할 폴더를 추가하려면 루트 .gitignore에 이와 비슷한 것을 추가하십시오.

/app/data/**/*.* !/app/data/**/*.md

그런 다음 *.md각 디렉토리에 설명이 포함 된 README.md 파일 (또는 이 경우 와 같이 고유하게 대상을 지정할 수있는 한 빈 파일은 중요하지 않음)을 커밋 하여 디렉토리가 모두 리포지토리의 일부로 유지되도록합니다. 확장자가있는 파일은 무시됩니다. 제한 : .의 디렉토리 이름에는 허용되지 않습니다!

xml / images 파일 등으로 모든 디렉토리를 채울 수 있으며 /app/data/앱 개발에 필요한 스토리지가 필요할 때 시간이 지남에 따라 더 많은 디렉토리를 추가 할 수 있습니다 (README.md 파일을 사용하여 각 스토리지 디렉토리의 내용에 대한 설명을 작성하십시오) 바로 그거죠).

각각의 새 디렉토리마다 새 디렉토리를 .gitignore작성하여 사용자를 변경 하거나 분산 시킬 필요가 없습니다 .gitignore. 아마도 가장 똑똑한 해결책은 아니지만 간결한 gitignore 현명하고 항상 나를 위해 일합니다. 좋고 간단합니다! ;)

여기에 이미지 설명을 입력하십시오


6

이 작업을 수행하는 쉬운 방법은 .gitkeep파일을 현재 디렉토리를 비 우려는 디렉토리 에 추가하는 것입니다.

더 자세한 정보는 이 SOF 답변 을 참조하십시오 -일부 사람들이 왜 .gitignore 파일을 추가하는 경쟁 관행을 찾는 지 설명합니다 (여기에서 많은 답변에 명시되어 있음).


4

전투에 하나 이상의 옵션을 추가.

git관련된 모든 목적을 위해 디렉토리를 추가하고 싶다고 가정하면 git, .gitignore여기에 여러 번 제안 된 것처럼 내용을 추적하지 않아야합니다. 여기서는 트릭을 수행합니다.

언급 된 바와 같이 형식은 다음과 같습니다.

*
!.gitignore

이제 명령 줄 에서이 작업을 수행 할 수있는 방법을 원한다면 추가하려는 디렉토리 안에 있는 동안 다음을 실행할 수 있습니다.

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

나 자신, 나는 이것을하기 위해 사용하는 쉘 스크립트를 가지고있다. 원하는대로 스크립트의 이름을 지정하고 포함 경로의 어딘가에 추가하거나 직접 참조하십시오.

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore

이를 통해 추가하려는 디렉토리 내에서 디렉토리를 실행하거나 첫 번째이자 유일한 매개 변수로 디렉토리를 참조 할 수 있습니다.

$ ignore_dir ./some/directory

당신이 그 빈 폴더 추적하려는 경우 (@GreenAsJade에 의해 코멘트에 응답) 또 다른 옵션은, 월은 미래에 추적 파일을 포함하지만, 지금은 비어있을 것이다, 당신은을 ommit 수 *로부터 .gitignore파일 및 확인 하는 것이 있다. 기본적으로 모든 파일은 " 나를 무시하지 마십시오" "라고 말하지만 디렉토리가 비어 있고 추적됩니다.

귀하의 .gitignore파일과 같을 것이다 :

!.gitignore

그게 다야, 체크인하고, 나중에 파일을 추적 할 수있는 비어 있지만 추적 된 디렉토리가 있습니다.

파일에 한 줄을 유지하는 것이 좋습니다 이유는 그것이 .gitignore목적을 제공 하기 때문입니다. 그렇지 않으면, 줄 아래에있는 일부 줄을 제거하려고 생각할 수 있습니다. 줄 위에 주석을 달면 도움이 될 수 있습니다.


4

때로는 "실제"비어있는 기존 디렉토리가 필요한 잘못된 작성된 라이브러리 또는 소프트웨어를 처리해야합니다. 간단하게 .gitignore쓰거나 .keep깨 뜨리면 버그가 발생할 수 있습니다. 이 경우 다음이 도움이 될 수 있지만 보장 할 수는 없습니다 ...

먼저 필요한 디렉토리를 작성하십시오.

mkdir empty

그런 다음이 디렉토리에 깨진 심볼릭 링크를 추가하십시오 (그러나 위에서 설명한 유스 케이스가 아닌 다른 경우에는 설명 README과 함께 사용하십시오 ).

ln -s .this.directory empty/.keep

이 디렉토리의 파일을 무시하려면 루트에 파일을 추가하십시오 .gitignore.

echo "/empty" >> .gitignore

무시 된 파일을 추가하려면 매개 변수를 사용하여 파일을 강제 실행하십시오.

git add -f empty/.keep

커밋 후 인덱스에 깨진 심볼릭 링크가 있고 git은 디렉토리를 만듭니다. 끊어진 링크는 일반 파일이 아니고 일반 파일이 아니기 때문에 몇 가지 장점이 있습니다. 따라서 그것은 의도적으로가 아니라 의미에 의해 "(파일을 포함하지 않는)"이라는 질문의 부분에 적합합니다.

find empty -type f

이 디렉토리에 파일이 없으므로이 명령은 빈 결과를 보여줍니다. 따라서 디렉토리에있는 모든 파일을 가져 오는 대부분의 응용 프로그램은 보통 "파일이 존재"하거나 "읽을 수있는"경우에는이 링크를 볼 수 없습니다. 일부 스크립트조차도 파일을 찾을 수 없습니다.

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

그러나 특별한 상황에서만이 솔루션을 사용하는 것이 좋습니다 README. 빈 디렉토리에 작성된 것이 좋은 솔루션입니다. (그리고 이것이 Windows 파일 시스템에서 작동하는지 모르겠습니다 ...)


4

읽기 @ofavre 의 및 @ stanislav - bashkyrtsev 힘내 디렉토리를 만들 깨진 GIT 서브 모듈 참조를 사용의 답변을, 나는 아무도 모든 일에 정신이 안전을 확인하기 위해 아이디어의 또이 간단한 수정을 제안하지 않았다 것을 놀라게하고 있습니다 :

오히려보다 GIT에 가짜 서브 모듈을 해킹 , 단지 빈 진짜를 추가 .

시작하다: https://gitlab.com/empty-repo/empty.git를

정확히 하나의 커밋이있는 GIT 저장소 :

commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000

메시지가없고 커밋 된 파일이 없습니다.

용법

빈 디렉토리를 GIT 저장소에 추가하려면 다음을 수행하십시오.

git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir

기존의 모든 빈 디렉토리를 서브 모듈로 변환하려면 다음을 수행하십시오.

find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;

Git은 서브 모듈 참조를 생성 할 때 최신 커밋 해시를 저장하므로 악의적 인 파일을 주입하기 위해이를 사용하는 저 (또는 GitLab)에 대해 걱정할 필요가 없습니다. 불행히도 체크 아웃 중에 어떤 커밋 ID가 사용되도록 강제 할 수있는 방법을 찾지 못했기 때문에 참조 커밋 ID가 e84d7b81f0033399e325b8037ed2b801a5c994e0사용 중인지 수동으로 확인해야합니다git submodule status 못했기 때문에 리포지토리를 추가 한 후 .

아직 기본 솔루션,하지만 누군가없이 우리가 아마 가질 수있는 최고의 손을 받고 정말 , 정말 망할 놈의 코드베이스에서 더러운.

부록 :이 커밋 재 작성

빈 디렉토리에서 다음을 사용하여이 정확한 커밋을 다시 만들 수 있어야합니다.

# Initialize new GIT repository
git init

# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"

# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"

# Add root commit
git commit --allow-empty --allow-empty-message --no-edit

재현 가능한 GIT 커밋을 만드는 것은 놀랍도록 어렵습니다.


3

당신은 할 수 없습니다. 이것은 Git 관리자가 의도적으로 디자인 한 결정입니다. 기본적으로 Git과 같은 소스 코드 관리 시스템의 목적은 소스 코드를 관리하는 것이며 빈 디렉토리는 소스 코드가 아닙니다. Git은 종종 컨텐츠 트래커라고도하며 빈 디렉토리는 컨텐츠가 아니므로 (실제로 반대) 추적되지 않습니다.


60
나는이 견해에 반대한다. 구조 는 내용이며 이름지정한 모든 내용이 내용에 기여합니다.
ThomasH

20
빈 파일은 소스 코드 나 내용이 아닙니다. 그냥 이름입니다. 그러나 Git은 빈 파일을 행복하게 추적합니다. Git이 빈 디렉토리를 추적하는 것을 거부하는 것은 의도적 인 디자인 결정이라고 생각하지 않습니다. 빈 디렉토리 추적은 99 %의 시간이 필요하지 않은 기능이므로 제대로 작동하는 데 필요한 추가 작업을 수행하지 않아도됩니다. 누군가가 기능을 구현하기에 충분하지 않은 경우 Git이 할 수 있습니다. 제대로 된 Git 관리자가 그러한 패치에 반대하는 것은 의심 스럽다.
Dan Molding

1
@TobyAllen 여기에 업데이트 된 FAQ 링크 가 있습니다. 가장 정확한 대답은 FAQ에서 권장하는 내용입니다.
Daniel Da Cunha

3
의도적 인 제한이 아닌 누락 된 기능 (낮은 우선 순위)입니다. Git FAQ에서 : 현재 Git 인덱스 (스테이징 영역)의 디자인은 파일 만 나열 할 수 있으며, 빈 디렉토리를 허용하도록 변경을 수행 할 수있는 권한을 가진 사람은 아무도이 상황을 해결하기에 충분하지 않습니다.
jbo5112 2016 년

실제로 동의하지 마십시오. 빈 폴더를 추적하려는 이유는 여러 가지가 있습니다. 예를 들어, 프로젝트를 위해 매우 가벼운 PHP MVC 프레임 워크를 개발 중입니다. 모델, 뷰 등을 배치하기위한 특정 폴더가 있습니다. 프레임 워크를 기반으로 새 사이트를 만들 때 기본적으로 모델이나 뷰가 없기 때문에 해당 폴더가 비어 있지만 폴더가 있어야합니다. 작동하지 않습니다!
Gladen

2

이 코드를 create_readme.php로 저장하고 Git 프로젝트의 루트 디렉토리에서 PHP 코드를 실행할 수 있습니다 .

> php create_readme.php

비어있는 모든 디렉토리에 README 파일을 추가하여 해당 디렉토리를 색인에 추가합니다.

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

그런 다음

git commit -m "message"
git push
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.