단일 파일을 제외한 모든 파일을 커밋에 추가 하시겠습니까?


571

변경 세트에 많은 파일이 있지만 수정 된 단일 파일을 구체적으로 무시하고 싶습니다. 다음과 같이 보입니다 git status:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

내가 할 수있는 방법이 git add있지만 만지고 싶지 않은 텍스트 파일을 무시하십시오. 다음과 같은 것 :

git add -u -except main/dontcheckmein.txt

답변:


851
git add -u
git reset -- main/dontcheckmein.txt

28
전체 폴더를 어떻게 제외합니까? -메인 또는 메인 / 또는 메인 / *?
Alan Coromano

8
@MariusKavansky이 양식을 모두 사용할 수 있습니다. 사용 main/*하는 경우 --경로 앞에 경로를 알리기 위해 앞에 추가해야 합니다. 다른 두 변형은 두 개의 대시를 포함하지 않고 작동합니다. (msysGit와 Windows 7에서 명령 프롬프트에서 테스트)
dennisschagt

2
많은 양의 파일 또는 다른 폴더가 포함 된 제외 할 폴더가있는 경우 임시로 gitignore에 추가하십시오. git reset그 폴더 에 대해 a 를 수행해 도 여전히 작동하지만 큰 폴더를 추가하는 데 시간이 오래 걸립니다.
Michael Trouw

2
그래서, 하나의 라이너가 없습니까?
BroVic

5
@ 벤 잭슨은 각 줄을 주석으로 처리 할 것입니다.
ed1nh0

140

1) 이미 버전이 지정된 단일 파일에 대한 변경 사항을 무시하려면

git update-index --assume-unchanged "main/dontcheckmein.txt"

그리고 그것을 취소 git update-index --no-assume-unchanged "main/dontcheckmein.txt"

파일을 무시하는 github 문서

2) 특정 단일 파일을 완전히 무시하여 리포지토리에서 파일을 만들 수 없음

먼저이 stackoverflow 게시물을보십시오 : Git global ignore not working

에서 .gitignore선행없이 파일에 상대 경로를 추가하십시오 ./.

그래서, 당신의 파일에있는 경우 MyProject/MyFolder/myfile.txt(여기서, .git에 또한 MyProject폴더) 추가 MyFolder/myfile.txt귀하에 .gitignore파일.

를 통해 무시와 관련된 규칙을 확인할 수 있습니다 git check-ignore "MyFolder/myfile.txt"

글로벌 무시에 대하여

이 링크는에 대해 이야기 ~/.gitignore_global하지만 파일은 프로젝트와 관련이 있습니다. 따라서 제외 패턴을 MyFolder/myfile.txt에 넣으면 ~/.gitignore_global작동하지만 의미가 없습니다 ...

반면, git config core.excludesfile .gitignorewhere .gitignoreis in으로 프로젝트를 설정 MyProject하면 로컬 파일이 재정의 ~/.gitignore_global되어 매우 유용한 규칙을 가질 수 있습니다 ...

현재로서는 at .gitignore과 혼합 할 스크립트를 만드는 것이 가장 좋습니다 .~/.gitignore_global.gitignore

마지막 경고 하나
무시하려는 파일이 이미 리포지토리에있는 경우이 방법을 수행하지 않으면이 방법이 작동하지 않습니다. git rm "MyFolder/myfile.txt"그러나 로컬에서 제거되기 때문에 먼저 백업하십시오! 나중에 다시 복사 할 수 있습니다 ...


5
git rm --cached MyFolder/myyfile.txt리포지토리에서 파일을 제거하는 데 사용할 수 있지만 로컬로 유지할 수 있습니다. help.github.com에 대한 설명
dennisschagt

87

파일

git add -u
git reset -- main/dontcheckmein.txt

폴더

git add -u
git reset -- main/*

9
왜 -u가 필요합니까? 왜 안돼 git add . && git reset -- main/*?

2
-u 옵션은 <pathspec>과 일치하는 항목이있는 인덱스를 업데이트합니다. 이렇게하면 작업 트리와 일치하도록 색인 항목이 제거 될뿐만 아니라 수정되지만 새 파일은 추가되지 않습니다. -u 옵션을 사용할 때 <pathspec>을 지정하지 않으면 전체 작업 트리에서 추적 된 모든 파일이 업데이트됩니다 (이전 버전의 Git은 업데이트를 현재 디렉토리 및 하위 디렉토리로 제한하는 데 사용됨).
Farhad Mammadli

6
누구나 git 전문가가 이해할 수없는 언어로 -u가 필요한 이유를 설명 할 수 있습니까?
Patrick

2
-u는 현재 진행중인 분기를 참조하는 데 사용됩니다. 더 이상 git push origin master다음 푸시 를 입력 할 필요가 없으며 git pushgit은 마스터 분기에 있음을 알 것입니다. 도움이 되길 바랍니다.
Pepeng Hapon

69

이제 pathspec 마술 과 짧은 형식으로 git지원합니다 . 따라서 다음 명령으로 쉽게 달성 할 수 있습니다.exclude certain paths and files:(exclude):!

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

실제로 더 지정할 수 있습니다.

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

1
최고의 답변, 감사합니다! 적어도 내 경우에는 파일 형식을 제외해야했습니다.
Andre Polykanine

15
이것은 우수하다! Linux에서는 :!...쉘이 불평하지 않도록 절을 인용해야합니다 . 따라서 예를 들면 다음과 같습니다 git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'..
Martin_W

같은 것이 :!/path/to/(file1|file2)있습니까?
seeker_of_bacon

이것은 zsh의 무언가와 충돌하여 macOS 및 최신 git에서 작동하지 않습니다.
멀린

1
누군가 이것이 공식적으로 문서화 된 곳을 가리킬 수 있습니까?
samurai_jane

20

Ben Jackson은 정확하지만 그 솔루션을 어떻게 사용했는지 추가 할 것이라고 생각했습니다. 아래는 내가 사용하는 매우 간단한 스크립트 (gitadd라고 함)는 파일에 나열된 일부를 제외하고 모든 변경 사항을 추가하는 데 사용되는 매우 간단한 스크립트입니다 ( .gittrackignore.gitignore 작동 방식과 매우 유사).

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

그리고 이것이 나의 현재 .gittrackignore모습입니다.

project.properties

배포 할 때 명령 줄에서 컴파일하는 Android 프로젝트에서 작업하고 있습니다. 이 프로젝트는 SherlockActionBar에 의존하므로 project.properties에서 참조해야하지만 컴파일과 엉망이므로 이제는 gitadd매번 project.properties를 추가하지 않고 git에 대한 모든 변경 사항을 입력 하고 추가하기 만하면 됩니다.


--당신의 의견까지 무엇 을 몰랐어요 . 매뉴얼 페이지에 따르면 선택 사항이며 명령의 결과를 변경하지 않습니다 (적어도이 경우). 이 질문은 stackoverflow.com/questions/17800994/… 을 지원하는 것으로 보입니다 . 만약 내가 틀렸다면 정정 해줘,하지만 "후 치료 무엇을 뜻 보인다 --인수가 아닌 옵션으로 / 전환"
앤서니 Naddeo

의 좋은 사용 --git checkout내가 그 질문에 참조하십시오. 나는 우리의이 교환까지 이중 대시가 무엇인지 몰랐다. git checkout브랜치와 파일 사이 의 모호성 이이 형식이나 다른 형식으로 영향을 줄 수 있는지 궁금합니다 git reset.
Giulio Piancastelli

10

파일의 변경 사항을 유지하지만 커밋하지 않기 위해이 작업을 수행했습니다.

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

파일이 제외되었는지 확인하려면

git status


4

사용하다 git add -A 한 번에 모든 수정 및 새로 추가 된 파일을 추가 할 수 있습니다.

git add -A
git reset -- main/dontcheckmein.txt



1

문제의 특정 사례의 경우 가장 쉬운 방법은 확장자 가 .c 인 모든 파일을 추가하고 나머지는 모두 생략하는 것입니다.

git add *.c

에서 자식-SCM (및 / 또는 man git add) :

자식 추가 <pathspec>…

컨텐츠를 추가 할 파일입니다. 일치하는 모든 파일을 추가하기 위해 Fileglobs (예 : * .c)를 제공 할 수 있습니다. <...>

이는 다음과 같은 작업을 수행 할 수 있음을 의미합니다.

git add **/main/*

main폴더 에있는 모든 파일 (무시되지 않음)을 추가 합니다. 보다 정교한 패턴으로 열광 할 수도 있습니다.

git add **/s?c/*Service*

위는 s(any char)c폴더 Service에 있고 파일 이름에 어딘가에있는 모든 파일을 추가합니다 .

분명히 명령 당 하나의 패턴으로 제한되지 않습니다. 즉, git에게 확장자가 .c.h 인 모든 파일을 추가하도록 요청할 수 있습니다 .

git add *.c *.h

링크 는 좀 더 멋진 패턴 아이디어를 줄 수 있습니다.

나는 많은 변경을 할 때 특히 유용하다는 것을 알지만 여전히 커밋을 수행하여 당시에 작동 할 수있는 변경 사항이 아닌 원자력을 유지하고 점진적 프로세스를 반영하기를 원합니다. 물론, 정교한 패턴을 만드는 데 드는 비용은 간단한 방법으로 파일을 추가하거나 한 번에 하나의 파일을 추가하는 비용보다 중요합니다. 그러나 대부분의 경우 간단한 패턴으로 필요한 파일을 쉽게 찾아 내고 다른 모든 것을 제외시킬 수 있습니다.

그건 그렇고, 당신 그것들을 작동시키기 위해 당신의 글로브 패턴을 인용해야 할 수도 있지만, 이것은 결코 나에게 해당되지 않았습니다.


0

나는 git add --patch꽤 약간을 사용 d하고 같은 파일을 통해 항상 충돌하지 않기 위해 이와 같은 것을 원했습니다 . 나는 일을 끝내기 위해 매우 해킹 된 git aliases를 채웠다.

[alias]
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
    ap                      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"

필자의 경우 항상 축소 된 특정 파일을 무시하고 싶었지만 $GIT_EXCLUDE_PATTERN더 일반적인 사용 사례 와 같은 환경 변수를 사용할 수 있습니다 .


0

커밋 할 변경 사항 : ( "git reset HEAD ..."를 사용하여 스테이지 해제)


0

당신은 이것을 시도 할 수 있습니다 : git add * && git reset main/dontcheckmein.txt

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