수색…


소개

이 항목에서는 Git 저장소에 불필요한 파일 (또는 파일 변경)을 추가하지 않는 방법을 설명합니다. git update-index --assume-unchanged 은 여러 가지 방법 (전역 또는 로컬 .gitignore , .git/exclude , git update-index --assume-unchangedgit update-index --skip-tree )이 있지만 콘텐츠 관리는 다음과 같은 것을 의미합니다. 무시하면 실제로 폴더 내용 (예 : 파일)이 무시됩니다. 빈 폴더는 기본적으로 무시됩니다. 어쨌든 추가 할 수 없기 때문입니다.

.gitignore 파일을 사용하여 파일 및 디렉토리 무시하기

Git이 특정 파일과 디렉토리를 무시하도록 만들 수 있습니다. 즉, 저장소에 하나 이상의 .gitignore 파일을 만들어서 Git이 추적하지 못하게 할 수 있습니다.

소프트웨어 프로젝트에서 .gitignore 일반적으로 빌드 프로세스 또는 런타임에 생성되는 파일 및 / 또는 디렉토리의 목록을 포함합니다. .gitignore 파일의 항목에는 다음을 가리키는 이름이나 경로가 포함될 수 있습니다.

  1. 임시 리소스 (예 : 캐시, 로그 파일, 컴파일 된 코드 등)
  2. 다른 개발자와 공유해서는 안되는 로컬 구성 파일
  3. 로그인 암호, 키 및 자격 증명과 같은 비밀 정보가 들어있는 파일

최상위 디렉토리에서 생성 된 규칙은 전체 저장소의 모든 파일과 하위 디렉토리에 반복적으로 적용됩니다. 하위 디렉토리에서 생성 된 규칙은 특정 디렉토리 및 하위 디렉토리에 적용됩니다.

파일이나 디렉토리가 무시되면 다음과 같이 표시되지 않습니다.

  1. 힘내에 의해 추적 됨
  2. git status 또는 git diff 와 같은 명령에 의해보고 됨
  3. git add -A 와 같은 명령으로 준비

추적 된 파일을 무시해야하는 특별한 경우에는 특별한주의를 기울여야합니다. 참고 : 이미 Git 저장소에 커밋 된 파일은 무시 하십시오.


예제들

다음은 glob 파일 패턴을 기반으로 .gitignore 파일에있는 규칙의 일반적인 예입니다.

# Lines starting with `#` are comments.

# Ignore files called 'file.ext'
file.ext

# Comments can't be on the same line as rules!
# The following line ignores files called 'file.ext # not a comment'
file.ext # not a comment 

# Ignoring files with full path.
# This matches files in the root directory and subdirectories too.
# i.e. otherfile.ext will be ignored anywhere on the tree.
dir/otherdir/file.ext
otherfile.ext

# Ignoring directories
# Both the directory itself and its contents will be ignored.
bin/
gen/

# Glob pattern can also be used here to ignore paths with certain characters.
# For example, the below rule will match both build/ and Build/
[bB]uild/

# Without the trailing slash, the rule will match a file and/or
# a directory, so the following would ignore both a file named `gen`
# and a directory named `gen`, as well as any contents of that directory
bin
gen

# Ignoring files by extension
# All files with these extensions will be ignored in
# this directory and all its sub-directories.
*.apk
*.class

# It's possible to combine both forms to ignore files with certain
# extensions in certain directories. The following rules would be
# redundant with generic rules defined above.
java/*.apk
gen/*.class

# To ignore files only at the top level directory, but not in its
# subdirectories, prefix the rule with a `/`
/*.apk
/*.class

# To ignore any directories named DirectoryA 
# in any depth use ** before DirectoryA
# Do not forget the last /, 
# Otherwise it will ignore all files named DirectoryA, rather than directories
**/DirectoryA/
# This would ignore 
# DirectoryA/
# DirectoryB/DirectoryA/ 
# DirectoryC/DirectoryB/DirectoryA/
# It would not ignore a file named DirectoryA, at any level

# To ignore any directory named DirectoryB within a 
# directory named DirectoryA with any number of 
# directories in between, use ** between the directories
DirectoryA/**/DirectoryB/
# This would ignore 
# DirectoryA/DirectoryB/ 
# DirectoryA/DirectoryQ/DirectoryB/ 
# DirectoryA/DirectoryQ/DirectoryW/DirectoryB/

# To ignore a set of files, wildcards can be used, as can be seen above.
# A sole '*' will ignore everything in your folder, including your .gitignore file.
# To exclude specific files when using wildcards, negate them.
# So they are excluded from the ignore list:
!.gitignore 

# Use the backslash as escape character to ignore files with a hash (#)
# (supported since 1.6.2.1)
\#*#

대부분의 .gitignore 파일은 다양한 언어에서 표준이므로 시작하려면 프로젝트에 복제하거나 복사 / 수정하려는 언어별로 나열된 샘플 .gitignore 파일 세트를 사용하십시오. 또는 새로운 프로젝트의 경우 온라인 도구를 사용하여 시작 파일 자동 생성을 고려할 수 있습니다.


.gitignore의 다른 형태들

.gitignore 파일은 저장소의 일부로 커밋되도록 만들어졌습니다. 무시 규칙을 적용하지 않고 특정 파일을 무시하려면 다음 옵션을 사용하십시오.

  • .git/info/exclude 파일을 편집합니다 ( .gitignore 와 동일한 구문 사용). 규칙은 저장소의 범위에서 전역 적입니다.
  • 모든 로컬 저장소에 무시 규칙을 적용 하는 글로벌 gitignore 파일 을 설정합니다.

또한 글로벌 git 설정을 변경하지 않고 추적 된 파일의 로컬 변경 사항을 무시할 수 있습니다.

  • git update-index --skip-worktree [<file>...] : 사소한 로컬 수정
  • git update-index --assume-unchanged [<file>...] : 제작 준비가되어 있고 변경되지 않는 파일 업스트림

후자의 플래그git update-index 문서의 차이점에 대한 자세한 내용 은 추가 옵션을 참조하십시오.


무시 된 파일 정리

git clean -X 를 사용하여 무시 된 파일을 정리할 수 있습니다.

git clean -Xn #display a list of ignored files
git clean -Xf #remove the previously displayed files

참고 : -X (대문자)는 무시 된 파일 정리합니다. untracked 파일도 제거하려면 -x (대문자)를 사용하십시오.

자세한 내용 git clean 설명서 를 참조하십시오.


자세한 내용 은 Git 매뉴얼 을 참조하십시오.

.gitignore 파일의 예외

패턴을 사용하여 파일을 무시하지만 예외가 있으면 예외에 느낌표 (!)를 접두사로 붙입니다. 예 :

*.txt
!important.txt

위 예제는 Git에게 important.txt 라는 파일을 제외하고 확장자가 .txt 모든 파일을 무시하도록 지시 important.txt .

파일이 무시 된 폴더에 있으면 다시 포함 할 수 없습니다 .

folder/
!folder/*.txt

이 예에서 폴더의 모든 .txt 파일은 무시 된 채로 남아 있습니다.

올바른 방법은 폴더 자체를 별도의 줄에 다시 넣은 다음 *folder 모든 파일을 무시하고 마지막으로 *.txt 를 다음과 같이 folder 다시 포함시킵니다.

!folder/
folder/*
!folder/*.txt

: 느낌표로 시작하는 파일 이름의 경우 두 개의 느낌표를 추가하거나 \ 문자로 이스케이프하십시오.

!!includethis
\!excludethis

전역 .gitignore 파일

Git이 모든 저장소에서 특정 파일을 무시하도록하려면 터미널이나 명령 프롬프트에서 다음 명령을 사용하여 전역 .gitignore만들있습니다 .

$ git config --global core.excludesfile <Path_To_Global_gitignore_file>

자식은 각 저장소의 자신의 .gitignore 파일에 추가로 이것을 사용할 것이다. 이 규칙은 다음과 같습니다.

  • 전역 .gitignore 가 파일을 명시 적으로 포함하는 경우 로컬 .gitignore 파일 .gitignore 파일이 포함되어있는 경우 로컬 .gitignore 가 우선 적용됩니다 (파일이 포함됩니다)
  • 저장소가 여러 컴퓨터에 복제 된 경우, 글로벌 .gigignore 모든 시스템에로드해야하거나 글로벌로 PC 동안 무시 파일이 REPO까지 추진 될 것이다 적어도, 그것은을 포함 .gitignore 그것을 업데이트 할 것 . 프로젝트가 팀에 의해 진행되는 경우 Repo 관련 .gitignore 가 글로벌 개념보다 나은 아이디어입니다

이 파일은 OSX .DS_Store , Windows Thumbs.db 또는 Vim *.ext~*.ext.swp 와 같이 플랫폼, 컴퓨터 또는 사용자별로 무시하는 것이 좋습니다. 저장소에 저장하지 않으려는 경우이 *.ext.swp 무시하십시오. . 따라서 OS X에서 일하는 한 팀원은 .DS_STORE_MACOSX (실제로 쓸모없는)를 모두 추가 할 수 있습니다. 반면 Windows의 다른 팀원은 모든 thumbs.bd 무시할 수 있습니다

이미 Git 저장소에 커밋 된 파일 무시

이미 Git 저장소에 파일을 추가 한 후 추적중지 하려는 경우 (이후에 커밋되지 않도록) 색인에서 제거 할 수 있습니다.

git rm --cached <file>

이렇게하면 파일을 저장소에서 제거하고 Git에서 추후 변경 사항을 추적 할 수 없게됩니다. --cached 옵션은 파일이 물리적으로 삭제되지 않도록합니다.

이전에 추가 된 파일 내용은 Git 히스토리를 통해 계속 볼 수 있습니다.

색인에서 파일을 제거한 후 다른 사람이 저장소에서 가져 오면 사본이 실제로 삭제 된다는 점에 유의하십시오.


Git이 파일의 작업 디렉토리 버전이 최신 버전 인 것처럼 보이게하고 대신 " worktree 건너 뛰기 "비트를 사용하여 색인 버전을 읽을 수 있습니다 (따라서 변경 사항을 무시함).

git update-index --skip-worktree <file>

쓰기는이 비트의 영향을받지 않으므로 내용의 안전이 최우선 순위입니다. 소중한 무시 된 변화를 결코 잃지 않을 것입니다. 반면에이 비트는 stashing과 충돌합니다.이 비트를 제거하려면 다음을 사용하십시오.

git update-index --no-skip-worktree <file>

때때로 Git에게 거짓말을하고 파일을 조사하지 않고 파일이 변경되지 않았다고 가정하는 것이 잘못 권고됩니다. 파일에서 인덱스를 제거하지 않고 파일에 대한 추가 변경 사항을 무시한 것으로 보입니다.

git update-index --assume-unchanged <file>

git이 파일에서 변경된 내용을 무시하도록 강제합니다 (이 파일에 대한 변경 사항을 가져 오거나 숨긴 경우 무시 된 변경 사항은 손실됩니다 )

git에서이 파일을 다시 "관리"하려면 다음 명령을 실행하십시오.

git update-index --no-assume-unchanged <file>

파일이 무시되는지 확인하기

git check-ignore 명령은 Git이 무시한 파일에 대해보고합니다.

명령 줄에서 파일 이름을 전달할 수 있으며 git check-ignoregit check-ignore 되는 파일 이름을 나열합니다. 예 :

$ cat .gitignore
*.o
$ git check-ignore example.o Readme.md
example.o

여기서 * .o 파일 만 .gitignore에 정의되어 있으므로 Readme.md는 git check-ignore 의 출력에 나열되지 않습니다.

.gitignore가 파일을 무시할 책임이있는 행을 보려면 git check-ignore 명령에 -v를 추가하십시오.

$ git check-ignore -v example.o Readme.md
.gitignore:1:*.o        example.o

Git 1.7.6부터 git status --ignored 를 사용하여 무시 된 파일을 볼 수도 있습니다. 공식 문서.gitignore가 무시한 파일 찾기 에서 더 많은 정보를 찾을 수 있습니다.

하위 폴더의 파일 무시 (여러 gitignore 파일)

다음과 같은 저장소 구조가 있다고 가정 해보십시오.

examples/
    output.log
src/
    <files not shown>
    output.log
README.md

examples 디렉토리의 output.log 는 유효하며 프로젝트가 이해를 수집하는 데 필요하지만 src/ 아래에있는 src/ 은 디버깅 중 작성되며 기록이나 저장소의 일부에 있으면 안됩니다.

이 파일을 무시하는 두 가지 방법이 있습니다. .gitignore 파일에 작업 디렉토리의 루트에 절대 경로를 지정할 수 있습니다.

# /.gitignore
src/output.log

또는, 당신은 만들 수 있습니다 .gitignore 에서 파일 src/ 디렉토리를이을 기준으로 파일 무시 .gitignore :

# /src/.gitignore
output.log

임의의 디렉토리에서 파일 무시하기

어느 디렉토리 에서나 foo.txt 파일을 무시하려면 이름을 써야합니다 :

foo.txt # matches all files 'foo.txt' in any directory

트리의 일부에서만 파일을 무시하려면 ** pattern을 사용하여 특정 디렉토리의 하위 디렉토리를 지정할 수 있습니다.

bar/**/foo.txt # matches all files 'foo.txt' in 'bar' and all subdirectories

또는 bar/ 디렉토리에 .gitignore 파일을 만들 수 있습니다. 이전 예제와 동일하게 파일 bar/.gitignore 를 다음 내용으로 작성합니다.

foo.txt # matches all files 'foo.txt' in any directory under bar/

무시 규칙을 커밋하지 않고 로컬에서 파일 무시

.gitignore 는 파일을 로컬에서 무시하지만 저장소에 커밋되고 다른 제공자 및 사용자와 공유되도록하기위한 것입니다. 전역 .gitignore 설정할 수 있지만 모든 저장소가 해당 설정을 공유합니다.

저장소의 특정 파일을 로컬에서 무시하고 파일을 저장소의 일부로 만들지 않으려면 저장소에서 .git/info/exclude 편집하십시오.

예 :

# these files are only ignored on this repo
# these rules are not shared with anyone
# as they are personal                                              
gtk_tests.py
gui/gtk/tests/*
localhost
pushReports.py
server/

미리 채워진 .gitignore 템플릿

.gitignore 파일에 나열 할 규칙이 확실하지 않거나 일반적으로 허용되는 예외를 프로젝트에 추가하려는 경우 .gitignore 파일을 선택하거나 생성 할 수 있습니다.

GitHub 및 BitBucket과 같은 많은 호스팅 서비스는 다음과 같은 프로그래밍 언어 및 IDE를 기반으로 .gitignore 파일을 생성 할 수있는 기능을 제공합니다.

GitHub. gitignore 드롭 다운

파일에 대한 후속 변경 사항을 무시하지 않고 (무시하지 않음)

때로는 Git에 파일을 저장하고 후속 변경 사항은 무시하고 싶을 때가 있습니다.

Git에게 update-index 사용하여 파일이나 디렉토리의 변경 사항을 무시하도록 알려주세요 :

git update-index --assume-unchanged my-file.txt

위의 명령은 Git이 my-file.txt 가 변경되지 않았다고 가정 my-file.txt 변경 사항을 확인하거나보고하지 않도록 지시합니다. 파일은 여전히 ​​저장소에 있습니다.

이는 기본값을 제공하고 로컬 환경 재정의를 허용하는 데 유용 할 수 있습니다. 예 :

# create a file with some values in
cat <<EOF
MYSQL_USER=app
MYSQL_PASSWORD=FIXME_SECRET_PASSWORD
EOF > .env

# commit to Git
git add .env
git commit -m "Adding .env template"

# ignore future changes to .env
git update-index --assume-unchanged .env

# update your password
vi .env

# no changes!
git status

파일의 일부만 무시 [스텁]

때로는 커밋하거나 게시하고 싶지 않은 파일에 로컬 변경 사항을 적용하고자 할 수 있습니다. 이상적으로 로컬 설정은 .gitignore 배치 할 수있는 별도의 파일에 집중해야하지만 때로는 단기 솔루션으로 체크인 된 파일에 로컬 파일을 만드는 것이 도움이 될 수 있습니다.

Git이 깨끗한 필터를 사용하여 해당 줄을 "알 수"있도록 할 수 있습니다. 그들은 심지어 diffs에 나타나지 않을 것입니다.

여기에 file1.c 파일의 스 니펫이 있다고 가정합니다.

struct settings s;
s.host = "localhost";
s.port = 5653;
s.auth = 1;
s.port = 15653; // NOCOMMIT
s.debug = 1; // NOCOMMIT
s.auth = 0; // NOCOMMIT

아무 곳에 나 NOCOMMIT 행을 게시하고 싶지는 않습니다.

.git/config 와 같은 자식 설정 파일에 이것을 추가하여 "nocommit"필터를 만듭니다.

[filter "nocommit"]
    clean=grep -v NOCOMMIT

이것을 .git/info/attributes.gitmodules 추가 (또는 생성)하십시오 :

file1.c filter=nocommit

그리고 NOCOMMIT 라인은 Git에 숨겨져 있습니다.

주의 사항 :

  • 깨끗한 필터를 사용하면 특히 Windows에서 파일 처리 속도가 느려집니다.
  • 무시한 줄은 Git이 파일을 업데이트 할 때 파일에서 사라질 수 있습니다. 그것은 얼룩 필터로 중화 될 수 있지만 더 까다 롭습니다.
  • Windows에서 테스트되지 않음

추적 된 파일의 변경 사항을 무시합니다. [그루터기]

.gitignore.git/info/exclude 는 추적되지 않은 파일에 대해서만 작동합니다.

추적 된 파일에서 무시 플래그를 설정하려면 update-index 명령을 사용하십시오.

git update-index --skip-worktree myfile.c

이를 되돌리려면 다음을 사용하십시오.

git update-index --no-skip-worktree myfile.c

이 스 니펫을 글로벌 git 설정 에 추가하면보다 편리한 git hide , git unhidegit hidden 명령을 사용할 수 있습니다.

[alias]
    hide   = update-index --skip-worktree
    unhide = update-index --no-skip-worktree
    hidden  = "!git ls-files -v | grep ^[hsS] | cut -c 3-"

update-index 함수에 --assume-unchanged 옵션을 사용할 수도 있습니다

git update-index --assume-unchanged <file>

변경 사항에 대해이 파일을 다시보고 싶다면 다음을 사용하십시오.

git update-index --no-assume-unchanged <file>

--assume-unchanged 플래그가 지정되면, 사용자는 파일을 변경하지 않을 것을 약속하고 작업 트리 파일이 인덱스에 기록 된 것과 일치한다고 가정합니다. 인덱스에서이 파일을 수정해야 할 경우 실패합니다 예를 들면 커밋에서 병합 할 때; 따라서 추측 된 untracked 파일이 업스트림으로 변경되는 경우 수동으로 상황을 처리해야합니다.이 경우 성능에 초점을 둡니다.

--skip-worktree 플래그는 파일이 로컬에서 변경되고 실수로 변경 사항을 커밋하지 않기 때문에 특정 파일을 건드리지 않도록 지시 할 때 유용합니다 (예 : 특정 파일에 대해 구성된 구성 / 속성 파일). 환경). Skip-worktree가 assum보다 우선 적용됩니다 (둘 다 설정되면 변경되지 않음).

이미 커밋 된 파일을 지우지 만 .gitignore에 포함됩니다.

때로는 파일이 git에 의해 추적되고 있지만 추후에 .gitignore에 추적을 중지하기 위해 파일이 추가되는 경우가 있습니다. 이러한 파일을 .gitignore에 추가하기 전에 정리하는 것을 잊는 것은 매우 일반적인 시나리오입니다. 이 경우 이전 파일은 여전히 ​​저장소에 있습니다.

이 문제를 해결하기 위해 저장소에서 모든 항목을 "실행 중지"한 다음 모든 파일을 다시 추가 할 수 있습니다. 보류중인 변경 사항이없고 --cached 매개 변수가 전달되는 한이 명령은 실행하는 것이 안전합니다.

# Remove everything from the index (the files will stay in the file system) 
$ git rm -r --cached .

# Re-add everything (they'll be added in the current state, changes included)
$ git add .

# Commit, if anything changed. You should see only deletions
$ git commit -m 'Remove all files that are in the .gitignore'

# Update the remote
$ git push origin master

빈 폴더 만들기

Git은 빈 폴더를 추가하고 커밋 할 수 없습니다. Git이 파일을 관리하고 디렉토리를 첨부하기 때문에 커밋을 줄이고 속도를 향상시킵니다. 이 문제를 해결하려면 두 가지 방법이 있습니다.

방법 1 : .gitkeep

이 문제를 해결하기위한 한 가지 방법은 .gitkeep 파일을 사용하여 Git 폴더를 등록하는 것입니다. 이렇게하려면 필요한 디렉터리를 만들고 .gitkeep 파일을 폴더에 추가하기 .gitkeep 됩니다. 이 파일은 비어 있으며 단순히 폴더를 등록하는 것 이외의 용도로는 사용되지 않습니다. Windows에서 (파일 명명 규칙이 어색함) 디렉토리에서 git bash를 열고 다음 명령을 실행하십시오.

$ touch .gitkeep

이 명령은 현재 디렉토리에서 빈 .gitkeep 파일을 만듭니다.

방법 2 : dummy.txt

이 또 다른 해킹은 상기와 같은 단계가 올 수 있습니다 매우 유사하지만, 대신의 .gitkeep , 단지 사용 dummy.txt 대신. 상황에 맞는 메뉴를 사용하여 Windows에서 쉽게 만들 수 있다는 보너스가 추가되었습니다. 그리고 재미있는 메시지를 남길 수 있습니다. 또한 .gitkeep 파일을 사용하여 빈 디렉토리를 추적 할 수 있습니다. .gitkeep 일반적으로 빈 directoy를 추적하기 위해 추가되는 빈 파일입니다.

.gitignore가 무시한 파일 찾기

명령을 사용하여 git에서 현재 디렉토리에 무시 된 모든 파일을 나열 할 수 있습니다.

git status --ignored

그래서 우리가 다음과 같은 저장소 구조를 가지고 있다면 :

.git
.gitignore
./example_1
./dir/example_2
./example_2

... 및 .gitignore 파일 포함 :

example_2

... 명령의 결과보다 :

$ git status --ignored

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

.gitignore
.example_1

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

dir/
example_2

재귀 적으로 무시 된 파일을 디렉토리에 나열하려면 추가 매개 변수 - --untracked-files=all 을 사용해야 --untracked-files=all

결과는 다음과 같습니다.

$ git status --ignored --untracked-files=all
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

.gitignore
example_1

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

dir/example_2
example_2


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow