파일이없는 빈 디렉토리를 Git 저장소에 어떻게 추가 할 수 있습니까?
파일이없는 빈 디렉토리를 Git 저장소에 어떻게 추가 할 수 있습니까?
답변:
디렉토리를 (거의) 빈 상태로 유지하는 또 다른 방법 .gitignore
은 다음 네 줄을 포함 하는 파일을 해당 디렉토리 내에 작성하는 것입니다 .
# Ignore everything in this directory
*
# Except this file
!.gitignore
그런 다음 m104의 솔루션 에서해야 할 방식으로 주문을받을 필요가 없습니다 .
또한 git 상태를 수행 할 때 해당 디렉토리의 파일이 "추적되지 않은"것으로 표시되지 않는 이점도 있습니다.
@GreenAsJade 의 의견을 지속적으로 만들기 :
이 솔루션이 질문에서 요구 한 것을 정확하게 수행한다는 점은 주목할 가치가 있지만 아마도이 질문을 보는 많은 사람들이 찾고있는 것은 아닐 것입니다. 이 솔루션은 디렉토리가 비어 있도록 보장합니다. "진짜로 파일을 체크인하고 싶지 않습니다"라고 말합니다. "여기에 체크인 할 파일이 없지만 여기에 디렉토리가 필요합니다. 파일이 나중에 올 수 있습니다".
README
안에 넣을 문서를 의견으로 쓴다 .gitignore
.
당신은 할 수 없습니다. 힘내 FAQ를 참조하십시오 .
현재 git index (스테이징 영역)의 디자인은 파일을 나열하는 것만 허용하며 빈 디렉토리를 허용하도록 변경 할만 큼 유능한 사람은 아무도이 상황을 해결하기에 충분하지 않았습니다.
디렉토리는 파일을 추가 할 때 자동으로 추가됩니다. 즉, 디렉토리를 저장소에 추가 할 필요가 없으며 자체적으로 추적되지 않습니다.
"
git add <dir>
" 라고 말하면 거기에 파일이 추가됩니다.체크 아웃에 디렉토리가 실제로 필요한 경우 파일을 작성해야합니다. .gitignore는이 목적에 적합합니다. 비워 두거나 디렉토리에 표시 될 파일 이름을 채울 수 있습니다.
git mv
git은 새로운 디렉토리가 버전 관리하에 있지 않다고 불평 할
.gitkeep
이 목적으로 불리는 빈 파일을 사용하는 많은 저장소를 보았습니다 .
.gitkeep
디렉토리에서 빈 파일을 작성 하고 추가하십시오.
.gitkeep
Git에 의해 처방되지 않았으며 사람들이 그 의미를 다시 추측하게하여 Google 검색으로 연결되어 여기로 연결됩니다. 그만큼.git
접두사 규칙은 힘내 자체가 사용하는 파일과 디렉토리에 예약해야합니다.
.git
접두사 규약을 예약해야합니다 ..."왜? git가이 예약을 요청합니까?
README
또는 ABOUT
파일이 좋거나 좋습니다. 우리가 URL보다 먼저 사용했던 것처럼 다음 사람에게 메모를 남깁니다.
리포지토리에서이 디렉터리를 원하는 이유 (비어있는 경우)에 대한 설명과 함께 항상 README 파일을 디렉터리에 넣을 수 있습니다.
touch .keep
Linux에서는이라는 빈 파일이 생성됩니다 .keep
. 가치가있는 것으로,이 이름은 Git에 독립적이며 .gitkeep
Git에만 해당됩니다. 둘째, 다른 사용자가 언급했듯이 .git
접두사 규칙은 Git 자체가 사용하는 파일과 디렉토리를 위해 예약되어야합니다.
또는 다른 답변 에서 언급했듯이 디렉토리에는 설명 README
이나 README.md
파일이 대신 포함될 수 있습니다 .
물론 파일이 존재하더라도 응용 프로그램이 중단되지 않아야합니다.
.keep
하거나 무시하십시오. 대신 디렉토리의 파일을 무시해야한다면 전혀 다른 질문입니다.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
추적되지 않은 모든 빈 디렉토리에서이 작업을 수행 하는 것이 좋습니다 .
먼저 첫 번째 것들:
빈 디렉토리 는 Git 버전 관리 시스템에서 트리의 일부가 될 수 없습니다 .
단순히 추적되지 않습니다. 그러나 빈 버전의 "버전 관리"가 의미가있는 시나리오가 있습니다. 예를 들면 다음과 같습니다.
cache/
또는 logs/
디렉토리)를위한 폴더 생성.gitignore
많은 사용자들이 제안합니다 :
README
디렉토리를 비우기 위해 파일 또는 다른 파일에 일부 내용 배치.gitignore
"역 논리"의 일종으로 파일을 끝에서, 방법 # 1의 동일한 목적을 수행하는 (즉 모든 파일을 포함합니다).두 솔루션 이 모두 작동 하지만 Git 버전 관리에 대한 의미있는 접근 방식과 일치하지 않습니다.
.gitignore
되는 일 ( 파일 유지 )을 사용 하는 이유 는 무엇 입니까?버전 관리 시스템에 폴더가 존재하도록하려면 빈 파일을 사용하십시오 .gitkeep
.
그렇게 큰 차이는 아니지만 보일 수 있습니다.
폴더를 유지하기위한 단일 목적의 파일을 사용 합니다. 당신은 당신이 넣고 싶지 않은 정보를 넣지 않습니다.
예를 들어, README와 폴더를 유지하는 데 대한 변명이 아니라 유용한 정보가있는 README를 사용해야합니다.
우려의 분리는 항상 좋은 일이며 .gitignore
원치 않는 파일을 무시 하기 위해를 추가 할 수 있습니다.
이름을 지정 .gitkeep
하면 파일 이름 자체 (그리고 공유 프로젝트 및 Git 저장소의 핵심 목적 중 하나 인 다른 개발자 에게도 ) 에서이 파일이 매우 명확하고 간단 합니다.
Laravel , Angular-CLI.gitkeep
와 같은 매우 중요한 프레임 워크에서 채택 된 접근 방식을 보았습니다 .
.gitkeep
git-prefixed가 아닌 다른 파일 이름 으로 대체하기 위해 답을 편집하면 내 의견을 얻습니다.이 정보가 가장 유익하고 유익한 답변이라고 생각합니다. 이유 : ".git *"는 git 규정 파일 용으로 예약해야한다고 생각하지만 이것은 단순한 자리 표시 자일뿐입니다. 내가 본 첫 번째 추측은 예를 들어 ".gitkeep"파일은 자동 무시되지만 (좋은 기능이 될 것입니다) 그렇지 않습니다.
다른 답변에서 설명했듯이 Git은 준비 영역에서 빈 디렉토리를 나타낼 수 없습니다. ( Git FAQ를 참조하십시오 .) 그러나 .gitignore
파일 이 들어있는 디렉토리가 비어있는 경우 다음을 .gitignore
통해서만 빈 디렉토리에 파일을 만들 수 있습니다 .
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
한 다음이 답변에서 선호하는 변형을 사용하는 것입니다. 올바른 폴더에서만 실행하십시오!
.gitignore
영향을 미치지 않습니다 . 내 의견은 디렉토리 트리에서 파일을 제거하는 것이므로 플래그를 적용 할 수 있습니다. -empty
find
.DS_Store
-empty
앤디 레스터는 잘하지만, 디렉토리 그냥 비어, 그리고 할 필요가있는 경우 비워 빈, 비어있는 넣을 수 있습니다 .gitignore
해결 방법으로 거기에 파일을.
제쳐두고 이것은 기본적인 Git 스토리지 디자인 문제가 아니라 구현 문제입니다. Git 메일 링리스트에서 여러 번 언급 한 것처럼, 이것이 구현되지 않은 이유는 패치를 제출할 수있는 사람이 아무도 없었기 때문입니다.
레일에 루비 생성 방법 폴더 로그인 :
mkdir log && touch log/.gitkeep && git add log/.gitkeep
이제 로그 디렉토리가 트리에 포함됩니다. 배포 할 때 매우 유용하므로 로그 디렉토리를 만들기 위해 루틴을 작성할 필요가 없습니다.
로그 파일은 발행하여 보관할 수 있습니다.
echo log/dev.log >> .gitignore
그러나 당신은 아마 그것을 알고 있었다.
힘내는 빈 디렉토리를 추적하지 않습니다. 자세한 설명 은 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
경고 :이 조정은 실제로 작동하지 않습니다. 불편을 드려 죄송합니다.
아래의 원본 게시물 :
Git 내장을 가지고 노는 동안 해결책을 찾았습니다!
빈 디렉토리를 만듭니다.
$ mkdir path/to/empty-folder
배관 명령과 빈 트리 SHA-1을 사용하여 색인에 추가하십시오 .
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
명령을 입력 한 후 두 번째 줄을 입력하십시오. 를 누른 Enter다음 Ctrl+ D를 눌러 입력을 종료하십시오. 참고 : 형식은 모드 [SPACE] 유형 [SPACE] SHA-1hash [TAB] 경로입니다 (탭이 중요합니다. 응답 형식은이를 유지하지 않습니다).
그게 다야! 빈 폴더가 색인에 있습니다. 커밋 만하면됩니다.
이 솔루션은 짧고 분명히 잘 작동합니다 ( EDIT! 참조 ). 그러나 기억하기 쉽지 않습니다 ...
빈 트리 SHA-1은 새로운 빈 Git 리포지토리를 생성 하고 빈 트리 SHA-1을 출력하는 cd
이슈를 발행 하여 찾을 수 있습니다 git write-tree
.
편집하다:
이 솔루션을 찾은 이후로 사용하고 있습니다. 어디에도 모듈이 정의되어 있지 않다는 점을 제외하면 하위 모듈을 만드는 것과 정확히 같은 방식으로 작동합니다. 발급시 오류가 발생 git submodule init|update
합니다. 문제는 부분을로 git update-index
다시 작성 한다는 것 입니다.040000 tree
160000 commit
또한 Git는 해당 경로 아래에있는 파일을 다른 저장소에 속한다고 생각하지 않습니다. 쉽게 간과 될 수 있으므로 불쾌합니다!
그러나 저장소에서 Git 하위 모듈을 아직 사용하지 않고 사용하지 않는 경우 "empty"폴더는 비어 있거나 Git이 해당 내용을 알고 내용을 무시하도록하려면 이 조정. 서브 모듈을 사용하여 일반적인 방법으로 이동하면 더 많은 단계가 필요합니다.
git svn dcommit
원하는 결과를 얻을 수 있습니까?
tmp 라는 빈 디렉토리가 필요하다고 가정 해 봅시다 .
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
다시 말해, Git에게이를 무시하도록 지시하기 전에 .gitignore 파일을 인덱스에 추가해야합니다 (빈 디렉토리의 다른 모든 것).
echo bla > file
당신은받지 않습니다 file: File exists
때문에 >
이미있을 경우 파일을 덮어 쓰기하거나 존재하지 않을 경우 새 번호를 생성합니다.
/bin/sh
문화적 가정! * "여기"가 csh
있고 변수 noclobber
가 설정되면 실제로 얻을 수 file: File exists
있습니다. 누군가가 "이것을 얻습니다"라고 말하는 경우, 그들이 바보라고 가정하지 말고 "아니요"라고 대답하십시오. * c2.com/cgi/wiki?AmericanCulturalAssumption
빈 디렉토리를 추가하면 해당 디렉토리가 존재할 것으로 예상되는 스크립트가 있기 때문에 가장 저항이 적은 경로 인 것 같습니다 (아마 생성 된 바이너리의 대상 일 수 있음). 또 다른 방법은 스크립트 를 수정하여 필요에 따라 디렉토리를 작성하는 것 입니다.
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
.generated
처음에 디렉토리가 존재하지 않기 때문에 클린 체크 아웃에서 "깨졌습니다" . 빌드를 한 후에는 더 이상 손상되지 않습니다.
빈 디렉토리에서도 문제가 발생했습니다. 플레이스 홀더 파일을 사용할 때의 문제점은 나중에 필요하지 않은 파일을 작성하고 삭제해야한다는 것입니다 (나중에 서브 디렉토리 나 파일이 추가 되었기 때문에이 플레이스 홀더 파일을 관리하는 큰 소스 트리를 사용하면 번거롭고 오류가 발생할 수 있습니다) 경향이 있습니다.
이런 이유로 저는 이러한 자리 표시 자 파일의 생성 / 삭제를 자동으로 관리 할 수있는 오픈 소스 도구를 작성하기로 결정했습니다. .NET 플랫폼 용으로 작성되었으며 Mono (Linux 용 .NET) 및 Windows에서 실행됩니다.
나는 @ 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.
도움이 되셨기를 바랍니다.
불행히도 결코 할 수 없을 것입니다. 이것은 Linus Torvald 자신이 내린 결정입니다. 그는 우리에게 좋은 것이 무엇인지 알고 있습니다.
내가 한 번 읽은 어딘가에 흠이 있습니다.
Re : Empty directory ..를 찾았 지만 다른 디렉토리 가있을 수 있습니다.
불행히도 해결 방법으로 살아야합니다.
언급했듯이 빈 디렉토리를 추가 할 수는 없지만 빈 .gitignore 파일을 모든 디렉토리에 추가하는 하나의 라이너가 있습니다.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
쉽게 액세스 할 수 있도록 이것을 Rakefile에 고정했습니다.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Jamie Flournoy의 솔루션은 훌륭합니다. 다음은 약간 강화 된 버전입니다 .htaccess
.
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
이 솔루션을 사용하면 빈 폴더, 예를 들어 커밋 할 수 있습니다 /log
, /tmp
또는 /cache
및 폴더가 비어있을 것입니다.
나는 항상 원하는 폴더 구조를 확인하고 프로젝트 내에서 나를 위해 빌드하는 함수를 작성합니다. 빈 폴더가 프록시에 의해 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에 있지만 대부분의 언어가 동일한 기능을 지원한다고 확신하며 폴더 생성은 응용 프로그램에서 처리하므로 폴더는 항상 존재합니다.
.gitkeep
규칙은 훨씬 더 나은 방법입니다.
해킹이 있지만 작동하는 것은 재미 있습니다 (Git 2.2.1). @Teka가 제안한 것과 비슷하지만 기억하기 더 쉽습니다.
git submodule add path_to_repo
).submodules
. 변경을 커밋하십시오..submodules
파일을 삭제 하고 변경 사항을 커밋하십시오.이제 커밋이 체크 아웃 될 때 생성되는 디렉토리가 있습니다. 흥미로운 점은이 파일의 트리 객체의 내용을 보면 다음과 같은 결과를 얻을 수 있다는 것입니다.
치명적 : 유효한 개체 이름이 아닙니다. b64338b90b4209263b50244d18278c0999867193
향후 버전의 Git에서 작동을 멈출 수 있기 때문에 사용하지 않는 것이 좋습니다. 저장소가 손상 될 수 있습니다.
많은 사람들이 이미이 질문에 대답했습니다. 여기에 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}
여러 시맨틱 디렉토리에 많은 임시 데이터를 저장할 폴더를 추가하려면 루트 .gitignore에 이와 비슷한 것을 추가하십시오.
/app/data/**/*.*
!/app/data/**/*.md
그런 다음 *.md
각 디렉토리에 설명이 포함 된 README.md 파일 (또는 이 경우 와 같이 고유하게 대상을 지정할 수있는 한 빈 파일은 중요하지 않음)을 커밋 하여 디렉토리가 모두 리포지토리의 일부로 유지되도록합니다. 확장자가있는 파일은 무시됩니다. 제한 : .
의 디렉토리 이름에는 허용되지 않습니다!
xml / images 파일 등으로 모든 디렉토리를 채울 수 있으며 /app/data/
앱 개발에 필요한 스토리지가 필요할 때 시간이 지남에 따라 더 많은 디렉토리를 추가 할 수 있습니다 (README.md 파일을 사용하여 각 스토리지 디렉토리의 내용에 대한 설명을 작성하십시오) 바로 그거죠).
각각의 새 디렉토리마다 새 디렉토리를 .gitignore
작성하여 사용자를 변경 하거나 분산 시킬 필요가 없습니다 .gitignore
. 아마도 가장 똑똑한 해결책은 아니지만 간결한 gitignore 현명하고 항상 나를 위해 일합니다. 좋고 간단합니다! ;)
전투에 하나 이상의 옵션을 추가.
에 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
목적을 제공 하기 때문입니다. 그렇지 않으면, 줄 아래에있는 일부 줄을 제거하려고 생각할 수 있습니다. 줄 위에 주석을 달면 도움이 될 수 있습니다.
때로는 "실제"비어있는 기존 디렉토리가 필요한 잘못된 작성된 라이브러리 또는 소프트웨어를 처리해야합니다. 간단하게 .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 파일 시스템에서 작동하는지 모르겠습니다 ...)
읽기 @ofavre 의 및 @ stanislav - bashkyrtsev 힘내 디렉토리를 만들 깨진 GIT 서브 모듈 참조를 사용의 답변을, 나는 아무도 모든 일에 정신이 안전을 확인하기 위해 아이디어의 또이 간단한 수정을 제안하지 않았다 것을 놀라게하고 있습니다 :
오히려보다 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 커밋을 만드는 것은 놀랍도록 어렵습니다.
당신은 할 수 없습니다. 이것은 Git 관리자가 의도적으로 디자인 한 결정입니다. 기본적으로 Git과 같은 소스 코드 관리 시스템의 목적은 소스 코드를 관리하는 것이며 빈 디렉토리는 소스 코드가 아닙니다. Git은 종종 컨텐츠 트래커라고도하며 빈 디렉토리는 컨텐츠가 아니므로 (실제로 반대) 추적되지 않습니다.
이 코드를 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
checkout
그러나 현재 버전의 Git에는 포함 되지 않습니다 .