programing

'git log'가 특정 경로에 대한 변경 사항을 무시하도록 설정

oldcodes 2023. 7. 3. 23:10
반응형

'git log'가 특정 경로에 대한 변경 사항을 무시하도록 설정

어떻게 만들 수 ?git log지정한 커밋 이외의 파일을 변경한 커밋만 표시하시겠습니까?

와 함께git log지정된 경로 집합에 해당하는 커밋에 대해 표시되는 커밋을 필터링할 수 있습니다.제가 원하는 것은 지정된 경로가 아닌 터치 경로만 나열되도록 필터를 반전시키는 것입니다.

원하는 것을 얻을 수 있습니다.

git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk

filter-log.pl다음과 같습니다.

#!/usr/bin/perl
use strict;
use warnings;

$/ = "\n/\n";
<>;

while (<>) {
    my ($commit, @files) = split /\n/, $_;

    if (grep { $_ && $_ !~ m[^(/$|.etckeeper$|lvm/(archive|backup)/)] } @files) {
        print "$commit\n";
    }
}

그것보다 좀 더 우아한 것을 원한다는 것을 제외하고는.

Git이 파일을 무시하도록 만드는 방법을 묻는 것이 아닙니다.이러한 파일은 추적되고 커밋되어야 합니다.그냥, 대부분의 경우, 저는 그들을 보는 것에 관심이 없습니다.

관련 질문:반전 방법 또는 패턴과 일치하지 않는 Git 로그를 표시하는 방법.경로가 아닌 커밋 메시지를 제외하고는 동일한 질문입니다.

2008년부터 이 주제에 대한 포럼 토론: Re: 에서 파일 제외.이것은 유망해 보였지만 실이 말라버린 것 같습니다.

Nguyễn Thai Ngọc Duy()pclouds의 문서에서 소개 경로 사양 마법과 커밋 ef79b1f커밋 1649612짧은 형식으로 구현되었습니다(2014년 1.9/2.0, Q1).

이제 하위 폴더 내용을 제외한 모든 항목을 기록할 수 있습니다.

git log -- . ':(exclude)sub'
git log -- . ':!sub'

또는 해당 하위 폴더 내의 특정 요소를 제외할 수 있습니다.

  • 특정 파일:

      git log -- . ':(exclude)sub/sub/file'
      git log -- . ':!sub/sub/file'
    
  • 내의 주어진 sub:

      git log -- . ':(exclude)sub/*file'
      git log -- . ':!sub/*file'
      git log -- . ':(exclude,glob)sub/*/file'
    

당신은 그 제외 사례를 무감각하게 만들 수 있습니다!

git log -- . ':(exclude,icase)SUB'

케니 에비트가 언급했듯이,

실행 중인 경우에는 작은 따옴표를 사용하거나 큰따옴표로 적절하게 이스케이프하는 것을 잊지 마십시오.git순식간에bash껍질, 예를 들어':!sub'또는":\!sub"그렇지 않으면 오류가 발생합니다.


참고: Git 2.13(2017년 2분기)에 동의어가 추가되었습니다.^!

커밋 859b7f1, 커밋 42eb9(torvalds2017년 2월 8일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 2017년 2월 27일 커밋 015fba3에서)

magic: '로지정 마법추: ' 가경▁'^!'

'''!음의 경로 사양은 수정을 위해 우리가 하는 것과 일치하지 않을 뿐만 아니라 견적이 필요하기 때문에 셸 확장에 대한 끔찍한 문자입니다.

그래서 '를 추가합니다.^제외 경로 지정 항목에 대한 대체 별칭으로 사용됩니다.


Git 2.28(2020년 3분기) 이전에는 작업 트리에서 추적되지 않은 경로를 포함하여 경로를 수집하는 동안 마이너스 경로 사양의 사용이 중단되었습니다.

Elija Newren()newren의 commit f1f061e(2020년 6월 5일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 커밋 64efa11, 2020년 6월 18일)

dir부정 경로 사양의 고정 처리

신고자: 존 밀리킨
사인 오프 바이: 엘리야 뉴렌

do_match_pathspec()로서 인생을 시작했습니다.match_pathspec_depth_1()그리고 정확성을 위해서는 오직 에서만 전화가 걸려오기로 되어 있었습니다.match_pathspec_depth().match_pathspec_depth()나중에 로 이름이 바뀌었습니다.match_pathspec()그래서 오늘 우리가 기대하는 불변성은do_match_pathspec()외부에 직접 전화를 거는 사람이 없습니다.match_pathspec().

불행하게도, 이 의도는 두 함수의 이름을 바꾸고 추가적인 호출로 인해 사라졌습니다.do_match_pathspec()되었습니다.

  • 75a6315f74("ls-files하위 모듈에 대한 경로 규격 일치 추가", 2016-10-07, Git v2.11.0-rc0 -- 배치 #11에 나열된 병합
  • 89a1f4aaf7("dir경로 사양이 dir 아래의 파일과 일치할 수 있는 경우 다시 해당 파일에 삽입하십시오.", 2019-09-17, Git v2.24.0-rc0).

물이야론.do_match_pathspec()에 비해 중요한 이점이 있었습니다.match_pathspec()--match_pathspec()는 플래그를 두 값 중 하나로 하드 코딩하며, 이 새로운 호출자들은 플래그에 대한 다른 값을 전달해야 했습니다.

또한, 비록 전화를 했지만,do_match_pathspec()직접적으로 부정확했고, 관찰 가능한 최종 출력에 차이가 없었을 가능성이 높습니다. 왜냐하면 버그는 단지 그것을 의미했기 때문입니다.fill_diretory()불필요한 디렉토리로 다시 이동합니다.

디렉터리 아래의 개별 경로에 대한 후속 do-this-path-match 검사는 이러한 추가 경로를 걸러내기 때문에 잘못된 기능을 사용하는 것과의 유일한 차이점은 불필요한 계산이었습니다.

두번째로 전화를 잘못 건 것은do_match_pathspec()직접 이동 또는 복사 + 복사를 통해 여러 개의 후기 리팩터에 포함되었습니다.

커밋 참조

  • 777b420347("dirtreat_leading_path()그리고.read_directory_recursive()2019-12-19, Git v2.25.0-rc0 -- 병합)
  • 8d92fb2927("dir지수 알고리즘을 선형 알고리즘으로 대체", 2020-04-01, Git v2.27.0-rc0 -- 배치 #5에 나열된 병합
  • 95c11ecc73("오류 발생 가능성이 높은 수정")fill_directory()API; 일치 항목만 반환", 2020-04-01, Git v2.27.0-rc0 -- 배치 #5에 나열된 병합

그 중 마지막으로 소개된 것은 다음과 같습니다.do_match_pathspec()개별 파일에서 반환되지 않아야 하는 개별 경로가 반환됩니다.

대신 호출할 때의 문제는 다음과 같은 부정적인 패턴이 무시된다는 것입니다.

새가 match_pathspec_with_flags()패턴을 합니다. 위에 큰 합니다.do_match_pathspec()다른 사람들이 그것을 잘못 사용하는 것을 방지하고, 현재의 발신자들을 수정합니다.do_match_pathspec()대신 둘 중 하나를 사용합니다.match_pathspec()또는match_pathspec_with_flags().

마지막으로 한 가지 주의할 점은DO_MATCH_LEADING_PATHSPEC는 특별한 가 필요합니다.DO_MATCH_EXCLUDE.

DO_MATCH_LEADING_PATHSPEC만약 우리가 다음과 같은 경로 스펙을 가지고 있다면.

*/Makefile

그리고 우리는 다음과 같은 디렉토리 경로를 확인하고 있습니다.

src/module/component

디렉터리에 이름이 지정된 파일이 있을 수 있기 때문에 디렉터리로 다시 들어가도록 일치하는 것으로 간주하고 싶습니다.Makefile아래 어딘가에

그러나 제외 패턴을 사용할 때, 즉 다음과 같은 경로 사양이 있습니다.

:(exclude)*/Makefile

다음과 같은 디렉터리 경로를 사용할 수 있습니다.

src/module/component

(음의) 일치입니다.

이름이 지정된 파일이 있을 수 있습니다.Makefile디렉터리 아래 어딘가에 다른 파일이 있을 수 있으므로 해당 디렉터리 아래의 모든 파일을 사전에 제외할 수 없습니다. 개별 파일을 다시 검색한 다음 확인해야 합니다.

을 합니다.DO_MATCH_LEADING_PATHSPEC양의 경로 사양에 대해서만 활성화되는 논리입니다.

tl;dr:shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)

Bash를 사용하는 경우 확장 글로빙 기능을 사용하여 필요한 파일만 가져올 수 있습니다.

$ cd -- "$(mktemp --directory)" 
$ git init
Initialized empty Git repository in /tmp/tmp.cJm8k38G9y/.git/
$ mkdir aye bee
$ echo foo > aye/foo
$ git add aye/foo
$ git commit -m "First commit"
[master (root-commit) 46a028c] First commit
 0 files changed
 create mode 100644 aye/foo
$ echo foo > bee/foo
$ git add bee/foo
$ git commit -m "Second commit"
[master 30b3af2] Second commit
 1 file changed, 1 insertion(+)
 create mode 100644 bee/foo
$ shopt -s extglob
$ git log !(bee)
commit ec660acdb38ee288a9e771a2685fe3389bed01dd
Author: My Name <jdoe@example.org>
Date:   Wed Jun 5 10:58:45 2013 +0200

    First commit

과 이과결할수있다니습합것▁this다▁with▁combine▁you를 조합할 수 있습니다.globstar재귀적 행동을 위한.

다음을 사용하여 파일의 변경 내용을 일시적으로 무시할 수 있습니다.

git update-index --skip-worktree path/to/file

은 앞로이파대모한든변경사무에 의해 됩니다.git status,git commit -a파일을 커밋할 준비가 되었으면 다음과 같이 되돌립니다.

git update-index --no-skip-worktree path/to/file

평소처럼 행동합니다.

언급URL : https://stackoverflow.com/questions/5685007/making-git-log-ignore-changes-for-certain-paths

반응형