git은 수정 된 변경 사항 만 추가하고 추적되지 않은 파일은 무시합니다.


658

"git status"를 실행했으며 아래에 나열된 일부 파일은 "커밋을 위해 준비되지 않은 변경 사항"이라는 제목 아래에 수정되었습니다. 또한 무시하려는 추적되지 않은 파일도 나열했습니다 (이 디렉토리에 ".gitignore"파일이 있음).

수정 된 파일을 준비 상태로두고 커밋 할 수 있습니다. "git add."를 실행하면 수정 된 파일과 스테이징에 무시하려는 파일이 추가되었습니다.

아래 git 상태가 표시되면 수정 된 파일 만 추가하고 추적되지 않은 파일을 무시하는 방법은 무엇입니까?

또한 ".gitignore"파일이 제대로 작동합니까?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")

1
파일을 추적 한 후 .gitignore 파일을 추가 한 경우 .gitignore 파일은 이미 추적중인 파일을 무시하지 않습니다. 문제가 될 수 있습니다.
BKSpurgeon

답변:


904

이상적으로 .gitignore는 추적되지 않은 (및 무시 된) 파일이 상태에 표시되고 git add등을 사용하여 추가되는 것을 방지해야 합니다..gitignore

git add -u수정 및 삭제 된 파일을 준비하도록 할 수 있습니다 .

git commit -a수정 및 삭제 된 파일 만 커밋 할 수도 있습니다.

2.0 이전의 Git 버전이 있고를 사용하는 경우을 git add .사용해야합니다 git add -u .( " git add -A"및 " git add ."의 차이점 참조 ).


74
관심의 대상으로,이 파일 ( add -u)은 파일 추가하지 않고 modified파일을 "추가" deleted합니다. 현재 방지하려는 것입니다.
Zach Lysobey

6
수정 된 파일 만 추가하려면 일반적으로 repo의 최상위 디렉토리로 이동하여을 입력하십시오 for fil in $(git diff --name-only --relative); do git add $fil; done. 내가 많이 사용한다면 (나는하지 않습니다), 나는 내 ~/.bashrc파일 에서 이것에 대한 별칭을 만들 것 입니다. 물론 이것은 bash에서만 작동합니다.
Krøllebølle

8
확실한 대답이없고 "가장 많은 사람들을위한 작품"만 대답합니까? 이 작업을 올바르게하려면 다른 프로세스를 사용해야합니까? 이것은 git add에 어떻게 내장되어 있지 않습니까? 그렇게하고 싶은 것이 일반적인 것 같습니다.
사무엘

2
nb 파일 이름이 이상한 경우 (공백, 별표, 그렇지 않은 경우)이 주석에 언급 된 방법이 실패합니다. 이상한 이름의 파일을 제대로 피하려면 다음을 사용하십시오.IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -u에 대한 짧은 git add --updategit commit -a대한 짧은git commit --all
휴고

96

이것은 나를 위해 일했다 :

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

또는 더 나은 :

$ git ls-files --modified | xargs git add

그룹을 재사용하지 않으려면 그룹화 (())가 필요하지 않으며 \ s는 파일 이름 앞에 공백을 남겨 두었습니다. 이 경우 최종 결과에 영향을 미치지는 않지만 예제 설정을 위해 여기에 사용한 sed 명령이 있습니다 : sed 's /.* modified : * //'. Mac OS X 10.9.5에서 확인되었습니다.
사무엘

@Samuel Grouping은 표현식을 테스트 할 때 유용합니다. 그런 다음 대괄호 안에 일치 항목을 인쇄하여 내가 옳다는 것을 알 수 있습니다.
user877329

1
@ Ярослав 귀하의 솔루션은 수정 및 추적되지 않은 파일을 추가하고 같으 git add -u므로 질문에 대답하지 않습니다.
Nick Volynkin

7
--modified는 삭제 된 것뿐만 아니라 수정 된 것 포함
DMart

2
자식 diff 파일 -z --diff-filter = M-이름 만 | xargs -0 git add --dry-run이 잘 작동하는 것 같습니다.
DMart

10
git commit -a -m "message"

-a :이 커밋에서 현재 변경 / 삭제 된 모든 파일을 포함합니다. 그러나 추적되지 않은 (새) 파일은 포함되지 않습니다.

-m : 커밋 메시지를 설정


4

당신은 현재 당신의 것을 말하지 .gitignore않았지만 .gitignore루트 디렉토리에 다음 내용이있는 것은 트릭을 수행해야합니다.

.metadata
build

3
내 .gitignore를 잘못 사용했습니다. 내용이있는 단일 gitignore 대신 무시하고 싶은 모든 디렉토리에 빈 .gitignore 파일이 있습니다.
Steve

1
@Steve : 각각의 경우 작동합니다. gitognore시작을 포함했습니다 (모든 것을 무시하십시오). 그러나 .gitignore최상위 디렉토리 의 단일 항목 은 일반적으로 사용하기가 훨씬 간단하고 충분합니다.
maaartinus

2

파일 목록을 먼저 볼 수 있도록 이것을 시도했습니다.

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

실행 :

chmod a+x file.sh
./file.sh 

편집 : (주석 참조) 한 단계로 수행 할 수 있습니다.

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status

1
이것은 한 단계로 달성 될 수있다 :git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

예, 그 솔루션도 제공해야합니다. 감사합니다. 게시물을 업데이트했습니다.
Mike Q

1

이것이 기능인지 버그인지 확실하지 않지만 이것은 우리에게 효과적이었습니다.

git commit '' -m "Message"

빈 파일 목록 ''에 유의하십시오. Git은이 파일을 해석하여 모든 수정 된 추적 파일을 준비하지 않은 경우에도 커밋하고 추적되지 않은 파일을 무시합니다.


--amend를 사용할 때는 확실히 작동하지 않습니다 .
GhostCat

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