programing

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

mailnote 2023. 5. 1. 21:42
반응형

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

Git 저장소에 빈 디렉터리(파일이 포함되지 않음)를 추가하려면 어떻게 해야 합니까?

있도록 또은 " " " " (거의) 디렉토리를 입니다..gitignore다음 네 줄이 포함된 디렉토리 내의 파일:

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

그렇다면 m104의 솔루션에서 당신이 해야 하는 방식으로 주문을 제대로 받을 필요는 없습니다.

이렇게 하면 Git 상태를 수행할 때 해당 디렉터리의 파일이 "추적되지 않음"으로 표시되지 않는다는 이점도 있습니다.

@GreenAsJade의 논평을 지속적으로 작성:

저는 이 해결책이 질문이 요구한 것을 정확하게 수행하지만, 아마도 이 질문을 바라보는 많은 사람들이 찾던 것은 아닐 것이라는 점에 주목할 필요가 있다고 생각합니다.이 솔루션을 사용하면 디렉터리가 빈 상태로 유지됩니다."여기서 파일을 절대 체크인하지 않습니다."라고 표시됩니다."아직 체크인할 파일이 없지만 디렉토리가 필요합니다. 나중에 파일이 올 수 있습니다."와 반대로

그럴수는 없어요.Git FAQ를 참조하십시오.

현재 Git 인덱스(스테이지 영역)의 설계에서는 파일만 나열할 수 있으며 빈 디렉토리를 허용하도록 변경할 수 있을 정도로 유능한 사람은 이 상황을 해결하기 위해 충분히 신경을 쓰지 않았습니다.

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

"라고 말할 수 있습니다.git add <dir>거기에 파일을 추가할 것입니다.

만약 당신이 체크아웃에 존재할 디렉토리가 정말로 필요하다면, 당신은 그 디렉토리에 파일을 만들어야 합니다. .gitignore는 이 목적을 위해 잘 작동합니다. 그것을 비워두거나 디렉토리에 표시될 것으로 예상되는 파일의 이름을 채울 수 있습니다.

는 빈 ..gitkeep 리에서터고, 그리렉.git add그것.

이것은 기본적으로 유닉스 계열 시스템의 숨겨진 파일이 될 것이지만, 이제 내용이 있기 때문에 Git가 디렉터리의 존재를 인식하도록 강제합니다.

또한 이 파일의 이름에는 특별한 내용이 없습니다.당신이 원하는 대로 이름을 지을 수도 있었습니다.Git가 신경쓰는 건 폴더에 뭔가가 들어있다는 거예요

항상 README 파일을 디렉토리에 저장하고 디렉토리가 비어 있는 이유를 설명할 수 있습니다.

touch .placeholder

Linux라는 의 빈 됩니다..placeholder이 이름은 git에 대한 불가지론적이며, 이 접근 방식은 시스템의 다양한 다른 위치에서 사용됩니다./etc/cron.d/.placeholder했듯이, 두번로사, 다자가지이듯적했용,.git접두사 규칙은 Git 자체가 구성 목적으로 사용하는 파일 및 디렉터리용으로 예약될 수 있습니다.

또는 다른 답변에서 언급한 것처럼 디렉토리설명 파일이 대신 포함될 수 있습니다.

어느 쪽이든 파일이 있으면 응용 프로그램이 손상되지 않습니다.

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

가장 먼저 해야 할 일:

빈 디렉토리는 Git 버전 관리 시스템의 트리에 포함될 수 없습니다.

그것은 단순히 추적되지 않을 것입니다.그러나 빈 디렉토리를 "버전"하는 것이 의미가 있을 수 있는 시나리오가 있습니다. 예를 들어, 다음과 같습니다.

  • 저장소의 모든 사용자/배포자가 사용할 수 있도록 사전 정의된 폴더 구조의 발판을 마련하거나, 위의 특수한 경우와 같이 임시 파일을 위한 폴더를 만드는 것.cache/또는logs/디렉터리, 폴더를 제공하려는 위치..gitignore그 내용.
  • 위와 관련하여 일부 프로젝트는 일부 폴더 없이는 작동하지 않습니다(이는 종종 제대로 설계되지 않은 프로젝트의 힌트이지만 실제 시나리오가 자주 발생하며, 예를 들어 권한 문제가 해결될 수 있음).

몇 가지 제안된 해결 방법

많은 사용자가 다음을 제안합니다.

  1. 하는 중README 있지 않게 파일 파일 렉토리를비않지게위디파해일또는일파있는일다또른이는용내부어있들기만▁file▁with▁non, ▁in▁or또▁directory는▁or▁file.
  2. 작성.gitignore일종의 "임의 논리"(즉, 모든 파일을 포함하는 것)를 가진 파일로, 마지막에 접근법 #1의 동일한 목적을 제공합니다.

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

  • 프로젝트에 실제로 원하지 않는 가짜 파일이나 README를 넣는 이유는 무엇입니까?
  • 을 사용하는 .gitignore파일을 보관하는 것이 가능하더라도 파일을 제외한 모든 것과 정반대의 작업을 수행하는 것이 가능합니까?

.gitkeep 접근법

다음 파일을 사용합니다..gitkeep버전 관리 시스템에서 폴더를 강제로 지정합니다.

그렇게 큰 차이는 없어 보이지만,

  • 사용자는 폴더를 보관하는 유일한 목적을 가진 파일을 사용합니다.당신은 거기에 당신이 넣고 싶지 않은 어떤 정보도 넣지 않습니다.

    예를 들어 README는 폴더를 보관하기 위한 구실이 아니라 유용한 정보가 있는 README로 사용해야 합니다.

    이고, 우려사항분것일좋며이은항히,▁a▁still▁add▁separ를 추가할 수 있습니다..gitignore원하지 않는 파일을 무시합니다.

  • 이름 짓기.gitkeep파일 이름 자체로부터 이 파일이 매우 명확하고 간단하다는 것을 확실히 합니다(그리고 공유 프로젝트 및 Git 저장소의 핵심 목적 중 하나에 좋은 다른 개발자에게도 마찬가지입니다).

    • 코드와 관련이 없는 파일(앞에 점과 이름이 있기 때문)
    • Git와 명확하게 관련된 파일입니다.
    • 그 목적(유지)은 무시하는 의미에서 명확하게 진술되고 일관적이며 의미적으로 반대됩니다.

입양

나는 본 적이 있습니다..gitkeepLaravel, Angular-CLI와 같은 매우 중요한 프레임워크에 의해 채택된 접근법.

다른 답변에서 설명한 것처럼 Git는 준비 영역에서 빈 디렉토리를 나타낼 수 없습니다.(Git FAQ 참조)그러나 사용자의 목적을 위해 디렉토리가 다음을 포함하는 경우 디렉토리가 충분히 비어 있습니다..gitignore하면 파일을 생성할 수 ..gitignore빈 디렉토리의 파일은 다음을 통해서만 표시됩니다.

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

Andy Lester가 옳지만 디렉토리가 비어 있어야 하고 비어 있으면 안 되는 경우에는 비어 있으면 됩니다..gitignore해결 방법으로 파일에 저장합니다.

별도로, 이것은 기본적인 Git 스토리지 설계 문제가 아니라 구현 문제입니다.Git 메일링 목록에서 여러 번 언급했듯이, 이것이 구현되지 않은 이유는 아무도 패치를 제출할 만큼 신경을 쓰지 않았기 때문이지, 할 수 없거나 해서는 안 되는 것은 아닙니다.

TL;DR: 디렉터리에 파일을 넣으면 git에 의해 추적됩니다.(계속).이것이 공식적인 해결 방법입니다.)

대신 빌드 스크립트 또는 배포 스크립트가 사이트에 디렉터리를 생성하도록 하는 것이 좋습니다.


추가 설명:

Git는 빈 디렉토리를 추적하지 않습니다.자세한 내용은 공식 Git FAQ를 참조하십시오.제안된 해결 방법은 다음과 같습니다..gitignore파일이 비어 있습니다.파일이 있는 경우 디렉터리는 더 이상 비어 있지 않으며 git에 의해 추적됩니다.

저는 그 해결책이 마음에 들지 않습니다. ».gitignore무시하는 것을 의미합니다.여기서 그것은 반대로 사용됩니다: 무언가를 무시하는 대신 무언가를 유지하는 것.

을 일적인방파이름지것입다니는정하을일반으로 지정하는 입니다..gitkeep이것은 적어도 파일 이름으로 의도를 전달합니다.또한 일부 프로젝트 간의 합의로 보입니다.Git 자체는 파일 이름이 무엇이든 상관하지 않습니다.디렉토리가 비어 있는지 여부만 중요합니다.

두 사람이 공유하는 문제가 있습니다..gitkeep그리고..gitignore파일이 unix 규약에 의해 숨겨져 있습니다.다음과 같은 일부 도구ls또는cp dir/*파일이 존재하지 않는 것처럼 가장하고 디렉토리가 비어 있는 것처럼 동작합니다.다과같은기도구타음과 같은 다른 find -empty하지 않을 것이다.뉴비 유닉스 사용자들은 이것에 대해 당황할 수 있습니다.숙련된 유닉스 사용자는 숨겨진 파일이 있다고 추론하고 확인합니다.어쨌든, 이것은 피할 수 있는 성가신 일입니다.

"숨겨진 문제"에 대한 간단한 해결책은 파일 이름을 지정하는 것입니다.gitkeep(앞 점 없이).한 걸음 더 나아가 파일 이름을 지정할 수 있습니다.README그런 다음 파일에서 디렉토리가 비어 있어야 하는 이유를 설명하고 디렉토리를 추적합니다.그런 식으로 다른 개발자(그리고 미래의 당신)들은 상황이 왜 그런 식인지 읽을 수 있습니다.

요약: 디렉터리에 파일을 삽입하면 git에 의해 (이전의 빈) 디렉터리가 추적됩니다.


잠재적 문제: 디렉터리가 더 이상 비어 있지 않습니다.

워크플로우에 기존 디렉토리만 필요한 경우 파일을 덤프해야 하는 경우에는 문제가 없습니다(아직 문제가 없습니다.그러나 파일을 추가로 처리하려면 문제가 발생할 수 있습니다.뿐만 아니라 의 악성 파일도 입니다..gitkeep또는README아니면 당신은 무엇을 가지고 있습니까.이렇게 이다음과같단순한구조를복있수다만니습들잡게하와 같은 가 복잡해질 수 .for file in dirname/*추가 파일을 제외하거나 특수한 경우를 제외해야 하기 때문입니다.

대신 워크플로우에 디렉토리가 필요한 경우, 디렉토리가 더 이상 비어 있지 않기 때문에 문제가 발생합니다.

Git는 빈 디렉토리를 추적하지 않습니다.git가 빈 디렉토리를 추적하도록 시도함으로써 보존하려는 바로 그 것, 즉 빈 디렉토리를 희생하게 됩니다.


몇 걸음 뒤로 물러나 보겠습니다.git track을 빈 디렉토리로 만드는 방법을 묻기 전에.

이때의 상황은 다음과 같습니다. 즉, 빈 디렉토리가 필요한 도구가 있습니다.이 도구를 배포/배포하고 빈 디렉터리도 배포하려고 합니다.문제: git는 빈 디렉터리를 추적하지 않습니다.

이제 빈 디렉터리를 추적하는 대신 다른 옵션을 살펴보겠습니다.배포 스크립트가 있을 수 있습니다.배포 스크립트가 git clone 후에 디렉터리를 생성하도록 합니다.또는 빌드 스크립트가 있습니다.컴파일 후 빌드 스크립트가 디렉터리를 생성하도록 합니다.또는 사용하기 전에 디렉토리를 확인하고 만들기 위해 도구 자체를 수정할 수도 있습니다.

도구가 다양한 환경에서 인간이 사용하도록 되어 있다면 도구 자체가 디렉터리를 확인하고 생성하도록 할 것입니다.도구를 수정할 수 없거나 도구가 고도로 자동화된 방식(도커 컨테이너 배포, 작업, 파괴)으로 사용되는 경우 배포 스크립트가 디렉토리를 생성하는 데 적합합니다.

저는 이것이 그 문제에 대한 더 현명한 접근법이라고 생각합니다.스크립트 빌드 및 배포는 프로그램을 실행하기 위한 것을 준비하기 위한 것입니다.도구에 빈 디렉터리가 필요합니다.따라서 이러한 스크립트를 사용하여 빈 디렉토리를 만듭니다.

보너스: 디렉터리가 사용될 때 실제로 비어 있음을 사실상 보장합니다.또한 다른 개발자(그리고 미래의 당신)들은 저장소에 있는 "빈" 디렉토리를 발견하지 못하고 왜 그것이 그곳에 있어야 하는지 궁금해할 것입니다.

요, 입니다론물▁of론입.mkdir빌드 스크립트는 다른 코드 라인과 마찬가지로 비트로 부패할 수 있습니다.하지만 그것은 개발의 본질적인 문제입니다.가짜 "빈" 디렉터리는 피할 수 있는 인위적인 문제입니다.

TL;DR: 빌드 스크립트 또는 배포 스크립트가 사이트에 빈 디렉토리를 생성하도록 합니다.또는 사용하기 전에 도구 자체가 디렉토리를 확인하고 작성하도록 합니다.


혼자 가는 것은 위험합니다.다음 명령을 수행합니다.

빈 디렉토리를 모두 나열하는 방법

find -type d -empty

동일하지만 검색을 피합니다..git디렉터리:

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

다음 명령은 "빈" 디렉터리가 포함된 프로젝트를 상속한 경우 유용할 수 있습니다.

이름이 " " " 인 입니다..gitkeep:

find -type f -name .gitkeep

모든 디렉터리와 디렉터리에 포함된 파일 수를 나열하는 방법

find -type f -printf "%h\n" | sort | uniq -c | sort -n

이제 정확히 하나의 파일을 포함하는 모든 디렉토리를 검사하고 "gitkeep" 파일인지 확인할 수 있습니다.이 명령은 실제로 비어 있는 디렉터리를 나열하지 않습니다.

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

아래의 원본 게시물:

Git 내부자들과 놀다가 해결책을 찾았어요!

  1. 리포지토리에 있다고 가정합니다.
  2. 빈 디렉토리를 만듭니다.

    $ mkdir path/to/empty-folder
    
  3. 배관 명령과 빈 트리 SHA-1을 사용하여 인덱스에 추가합니다.

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

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

  4. 바로 그거야!빈 폴더가 색인에 있습니다.당신이 해야 할 일은 헌신하는 것입니다.

이 솔루션은 짧고 잘 작동합니다(편집 참조). 하지만 기억하기가 그렇게 쉽지는 않습니다.

트리 은 빈 저장소인 "SHA-1"을 생성하여 수 .cd그것과 쟁점에.git write-treeSHA-1을 합니다.

편집:

저는 이 솔루션을 발견한 이후로 계속 사용하고 있습니다.모듈이 정의되어 있지 않다는 점을 제외하고는 하위 모듈을 만드는 것과 정확히 동일한 방식으로 작동합니다.는 이로인발시발다생니합오류가행을 발행할 때 가 발생합니다.git submodule init|update는 문는입니다.git update-index다시쓰를 다시 .040000 tree 나누다160000 commit.

또한 해당 경로 아래에 배치된 파일은 다른 리포지토리에 속한다고 생각하기 때문에 Git에 의해 절대로 인식되지 않습니다.이것은 쉽게 간과될 수 있기 때문에 고약합니다!

그러나 저장소에서 Git 하위 모듈을 아직 사용하지 않거나 사용하지 않을 경우 "빈" 폴더가 비어 있거나 Git이 존재함을 알고 내용을 무시하기를 원한다면 이 수정을 수행할 수 있습니다.서브모듈을 사용하여 일반적인 방식으로 진행하려면 이 조정보다 더 많은 단계가 필요합니다.

tmp라는 빈 디렉토리가 필요하다고 가정해 보겠습니다.

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

즉, .gitignore 파일을 인덱스에 추가해야 Git에게 무시하도록 지시할 수 있습니다(및 빈 디렉터리의 다른 모든 항목).

Ruby on Rails 로그 폴더 생성 방법:

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

이제 로그 디렉터리가 트리에 포함됩니다.배포 시 매우 유용하므로 로그 디렉터리를 만드는 루틴을 작성할 필요가 없습니다.

로그 파일은 발급을 통해 외부로 유출할 수 있습니다.

echo log/dev.log >> .gitignore

하지만 당신은 아마 알고 있었을 겁니다

빈 디렉토리 안에 .gitkeep 파일을 추가하고 커밋합니다.

touch .gitkeep

그것은 Git 다음에 나오는 표준입니다.

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

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

저는 Artur79와 mjs답변이 마음에 들어 두 가지를 조합하여 프로젝트의 표준으로 만들었습니다.

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

그러나 소수의 개발자만 Mac 또는 Linux에서 작업합니다.Windows에서 많은 작업을 수행할 수 있지만, Windows에서 동일한 작업을 수행할 수 있는 간단한 한 줄기를 찾을 수 없었습니다.어떤 사람들은 운이 좋게도 다른 이유로 Cygwin을 설치했지만, 이것만을 위해 Cygwin을 처방하는 것은 지나친 것처럼 보였습니다.

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

하지만 이것을 작은 유틸리티 명령어로 만드는 것이 더 나을 것 같아서 파이썬을 이용해 다시 만들어 이곳 PyPI에 게시했습니다.다음을 실행하여 설치할 수 있습니다.

pip3 install gitkeep2

생및제수있다니습할거성▁and다를 만들고 할 수 ..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: 디렉토리를 찾았습니다. 하지만 다른 디렉토리가 있을 수도 있습니다.

당신은 해결책을 가지고 살아야 합니다..불행하게도.

이 해결책은 저에게 효과가 있었습니다.

추가.gitignore을 빈디렉토리에 합니다.

*
*/
!.gitignore
  • *의 합니다.
  • */ 무시
  • !.gitignore file.gitignore 파일

그런 다음 캐시를 제거하고 파일을 준비한 다음 커밋하고 푸시합니다.

git rm -r --cached .
git add . // or git stage .
git commit -m ".gitignore fix"
git push

저도 빈 디렉토리에 대한 문제에 직면해 있습니다.자리 표시자 파일을 사용할 때의 문제는 자리 표시자 파일이 더 이상 필요하지 않은 경우 자리 표시자 파일을 작성하고 삭제해야 한다는 것입니다. 나중에 하위 디렉토리 또는 파일이 추가되었기 때문입니다.빅 소스 트리를 사용하면 자리 표시자 파일을 관리하는 것이 번거롭고 오류가 발생하기 쉽습니다.

이것이 제가 그러한 자리 표시자 파일의 생성/삭제를 자동으로 관리할 수 있는 오픈 소스 도구를 쓰기로 결정한 이유입니다.그것은 을 위해 쓰여져 있습니다.모노(.) 환경에서 실행되는 NET 플랫폼NET(리눅스용) 및 윈도우즈.

다음을 확인해 보십시오. http://code.google.com/p/markemptydirs

를 할 때.gitignore파일, 만약 당신이 그것에 (기트가 무시하기를 원하는) 내용의 양을 넣을 것이라면 당신은 별표만 있는 한 줄을 추가하고 싶을 것입니다.*무시된 내용을 실수로 추가하지 않도록 합니다.

Git 디렉토리를 만들기 위해 깨진 Git 하위 모듈 참조를 사용한 Avre Stanislav-bashkyrtsev의 답변을 읽고, 아직 아무도 모든 것을 제정신이고 안전하게 만들기 위한 아이디어의 간단한 수정을 제안하지 않았다는 것에 놀랐습니다.

Git에 가짜 서브모듈을 해킹하는 대신실제 서브모듈추가합니다.

입력: https://gitlab.com/empty-repo/empty.git

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

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

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

사용.

GIT repo에 빈 디렉토리를 추가하는 방법

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레포를 추가한 후.

여전히 네이티브 솔루션은 아니지만, GIT 코드베이스에서 누군가가 손을 쓰지 않고우리가 가질 수 있는 최고의 솔루션입니다.

부록: 이 커밋 다시 만들기

이 정확한 커밋은 빈 디렉토리에서 다음을 사용하여 재생성할 수 있어야 합니다.

# 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가 추적할 디렉터리에 자리 표시자 파일을 추가하는 것입니다.

수 을 포함할 수 은 파일이지수있모포파든다수함라는 이름의 빈 합니다..gitkeep((VCS-agnostic)을 .keep).

.숨김 파일로 표시합니다.

다른 아이디어는 다음을 추가하는 것입니다.README디렉터리가 사용되는 용도를 설명하는 파일입니다.

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

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

나는 이것을 쉽게 접근할 수 있도록 Rake 파일에 넣어 두었습니다.

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}

저는 항상 제가 원하는 폴더 구조를 확인하고 프로젝트 내에서 만들어주는 기능을 구축합니다.이렇게 하면 빈 폴더가 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에 있지만 대부분의 언어가 동일한 기능을 지원하며, 폴더 생성은 응용 프로그램에서 처리하기 때문에 폴더는 항상 거기에 있을 것입니다.

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

  • 저장소에 합니다.git submodule add path_to_repo)
  • 됩니다..submodules변경을 수행합니다.
  • .submodules파일을 작성하고 변경 내용을 커밋합니다.

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

fatal: 잘못된 개체 이름 b64338b90b4209263b50244d18278c0999867193

하지만 향후 Git 버전에서는 작동이 멈출 수 있기 때문에 사용을 권장하지 않습니다.리포지토리가 손상될 수 있습니다.

제이미 플로르노이의 해결책은 잘 작동합니다.다음은 유지하기 위한 약간 향상된 버전입니다..htaccess:

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

폴더를 수 . 를 들어 이솔션을루사커수있다습니할밋폴를더빈면용하,▁with▁for다▁you있니▁example▁a▁folder습▁are▁solution▁empty. 예를 들어/log,/tmp또는/cache폴더가 비어 있습니다.

여러 시맨틱 디렉터리에 많은 임시 데이터를 저장할 폴더를 추가하려면 한 가지 접근 방식은 루트 .gitignore...에 이와 같은 것을 추가하는 것입니다.

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

설명적인.md 파일 빈 파일)을 수 . README.md 파일( 빈 파일)과 할 수 .*.md이 경우)를 각 디렉터리에 저장하여 디렉터리가 모두 repo의 일부로 남아 있지만 확장자가 있는 파일은 무시됩니다. 사항: 제한사:.디렉터리 이름에는 를 사용할 수 없습니다!

디렉토리를 xml 디렉토리로 러이한모를 xml/images파에서 더 많은 디렉토리를 할 수 ./app/data/시간이 지남에 따라 애플리케이션에 필요한 스토리지가 개발됩니다(각 스토리지 디렉토리의 정확한 용도에 대한 설명으로 README.md 파일이 굽습니다).

의 더이변필없다습니요가할을 더 이상 ..gitignore또는 새로운 데이터를 생성하여 분산화합니다..gitignore각 새 디렉터리에 대해.아마도 가장 현명한 해결책은 아닐 것입니다. 하지만 현명하지 못하고 항상 저에게 효과가 있습니다.착하고 단순해요!;)

여기에 이미지 설명 입력

그럴수는 없어요.이것은 Git 유지 관리자의 의도적인 설계 결정입니다.기본적으로 Git와 같은 소스 코드 관리 시스템의 목적은 소스 코드를 관리하는 것이며 빈 디렉토리는 소스 코드가 아닙니다.Git는 종종 내용 추적기로도 설명되며, 빈 디렉터리는 내용이 아니므로(실제로는 그 반대) 추적되지 않습니다.

때로는 "실제" 비어 있고 기존 디렉터리가 필요한 잘못된 문서 라이브러리나 소프트웨어를 처리해야 합니다. 단화를 넣는 것..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 파일 시스템에서 작동하는지 모르겠습니다...)

이를 위한 쉬운 방법은 다음을 추가하는 것입니다..gitkeep파일을 빈 상태로 유지할 디렉토리에 저장합니다.

자세한 내용은 이 SOF 답변을 참조하십시오. 이 답변은 일부 사람들이 .gitignore 파일을 추가하는 경쟁 관례를 혼란스럽게 생각하는 이유도 설명합니다.

언급URL : https://stackoverflow.com/questions/115983/how-do-i-add-an-empty-directory-to-a-git-repository

반응형