셸 종료 코드로 파일을 추적하는지 확인하는 방법은 무엇입니까?


357

git명령 을 실행 하고 종료 코드를 확인 하여 파일을 추적하고 있는지 알 수있는 방법이 있습니까?

즉, 자식이 파일을 추적하고 있습니까?


요점은 파일을 추적 또는 추적되지 않은 것으로 결정하는 기준이 무엇이라고 생각합니다. 검색 할 추적 된 파일 모음이 있어야합니다.
smwikipedia

답변:


443

시험:

git ls-files --error-unmatch <file name>

파일을 추적하지 않으면 1로 종료됩니다


적어도 내 이전 (1.6.0) 버전의 git에서는 파일 이름 앞에--error-unmatch 옵션 을 넣어야 오류가 발생합니다. 어떻게 든 옵션은 그 뒤에 오는 파일 이름에만 적용됩니다.
Alex Dupuy 2012

실제로 문제는 GNU getopt 옵션 순열이 활성화되어 있지 않으며 파일 이름 뒤에 (또는 뒤에 --) 나타날 때 --error-unmatch다른 (인덱스가 아닌) 파일 이름으로 취급되며 효과가없는 것 같습니다.
Alex Dupuy 2012

29
git ls-files | grep <PATTERN>? 예 :git ls-files | grep Main.h
gaussblurinc

1
[순진한 방법] 파일을 약간 변경합니다 (공백 추가 / 제거). 'git status'를 입력하면 파일이 나열되는지 확인하십시오. 어리석은 방법이지만 시간을 절약 할 수 있습니다.
BraveNinja

그러나 "git add -A && git commit -m"blah "명령으로 추가하고 커밋합니다."git ls-tree --name-only -r sha1 "명령으로 전체 파일을 볼 수 있습니다.
Dr.jacky

66

오류 메시지로 콘솔을 복잡하게 만들지 않으려면 다음을 실행할 수도 있습니다.

git ls-files file_name

그런 다음 결과를 확인하십시오. git이 아무것도 반환하지 않으면 파일이 추적되지 않습니다. 추적되면 git은 파일 경로를 반환합니다.

이 스크립트는 스크립트와 같은 스크립트 (예 : PowerShell)로 결합하려는 경우에 유용합니다.

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

file_name정확히 일치해야 한다고 생각 하지만 (전체 경로 + 파일 이름) 와일드 카드와 함께 사용할 수 있습니다.git ls-files *foo.rb
dechimp

16

편집하다

bash에서 git을 사용해야하는 경우 다음과 같은 --porcelain옵션이 있습니다 git status.

-도자기

스크립트에 대해 안정적이고 구문 분석이 쉬운 형식으로 출력을 제공하십시오. 현재 이것은 짧은 출력과 동일하지만 향후 변경되지 않으므로 스크립트에 안전합니다.

출력은 다음과 같습니다.

> git status --porcelain
 M starthudson.sh
?? bla

또는 한 번에 하나의 파일 만 수행하는 경우 :

> git status --porcelain bla
?? bla

기발한

하다:

git status

업데이트 된 파일과 추적되지 않은 파일을 나타내는 보고서가 표시됩니다.

당신 bla.sh은 추적 및 수정되고 newbla추적되지 않는 것을 볼 수 있습니다 :

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

더 명확 해져야해서 미안합니다. 상태는 정상이지만 출력을 구문 분석하는 것보다 종료 코드를 확인하고 싶습니다.
Dale Forester

git status --porcelain당신이 스크립트에 의해 구문 분석 출력 할 필요가 링크 된 문서를 살펴 그것이 다른 유용한 옵션 보여줄 경우 당신의 친구입니다
stefanB

Hihi, 아주 오래된 힘내 작동하지 않는다 : git status --porcelain error: unknown option 도자기 '버전은 1.6.0 :-)입니다
Laryx 탈락

@ user465139 맞습니다 ... git 1.7.0 이상이 필요합니다 (그때까지는 도자기 옵션이 추가되지 않았습니다).
mason81

13

git status파일에서 실행 해보십시오 . git에서 추적하지 않으면 오류가 인쇄됩니다.

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

와. 디렉토리에서 실행해야했으며 전체 저장소를 확인하는 것처럼 작동했습니다. 감사.
Dale Forester

4
실제로, 내가 실행 git status trackedfile하면 종료 코드 1 (0이 유용 할 것으로 예상 됨)이 표시되지만 출력에서 ​​"오류 :"를 표시하지 않습니다. 오히려 문자열 출력보다 종료 코드를 구문 분석하고 싶습니다.
Dale Forester

43
git working copy에 있지만 .gitignore에 의해 제외 된 파일에서 git status를 실행하면 오류가 발생하지 않습니다. (즉,이 답변은하지 않습니다.)
JellicleCat

파일이 무시 목록에있을 경우, 즉 파일에 있으면 제대로 작동하지 않습니다..gitignore
Robin Hsu

8
작동하지 않습니다. 파일이 존재하지 않더라도 항상 같은 것을 인쇄합니다. $ git status notthere:On branch master nothing to commit, working directory clean
클로이

6

"나쁜"종료 코드를 제공하는 git 명령을 모르지만 쉬운 방법은 추적되지 않는 파일에 대해 출력을 제공하지 않는 git 명령을 사용하는 것 같습니다. git-log 또는 git-ls-files. 그렇게하면 실제로 구문 분석을 수행 할 필요가 없습니다. grep과 같은 다른 간단한 유틸리티를 통해 출력이 있는지 확인할 수 있습니다.

예를 들어

git-ls-files test_file.c | grep.

파일이 추적되면 0 코드로 종료되지만 파일이 추적되지 않으면 종료 코드 1로 종료됩니다.


3

나는 당신 에게 사용자 정의 별칭 을 제안 합니다 .gitconfig.

당신은해야 할 길 :

1) git 명령으로 :

git config --global alias.check-file <command>

2) ~/.gitconfig별칭 섹션에서이 줄을 편집 하고 추가하십시오.

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

명령 (1) 또는 저장된 파일 (2)을 시작하면 작업 공간에서 다음을 테스트 할 수 있습니다.

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

를 사용 git log하면 이에 대한 정보가 제공됩니다. 파일이 git에서 추적되면 명령에 일부 결과 (로그)가 표시됩니다. 그렇지 않으면 비어 있습니다.

예를 들어 파일이 자식 추적 인 경우

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

파일이 자식 추적되지 않으면

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

내 두 센트 :

git ls-files | grep -x relative/path

여기서 relative/path용이하게 가압에 의해 결정될 수있다 tab자동 완성 쉘 내에. | wc -l 1 또는 0 출력을 얻으려면 추가 를 추가하십시오 .


경로에 따라 (예 : 점이 포함 된 경우) grep옵션 을 추가해야합니다 --fixed-strings.
EndlosSchleife
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.