파일에서 특정 줄에 대한 커밋 로그를 검색하시겠습니까?
파일에서 특정 행을 터치한 커밋에 대한 커밋 로그를 git에서 제공할 수 있는 방법이 있습니까?
예를 들면요?git blame
그러나 , , ,는 것을 의미합니다.git blame
특정 라인에 닿은 마지막 커밋이 표시됩니다.
파일 내 어디에 대한 커밋 목록이 아니라 특정 행에 닿은 커밋에 대한 유사한 로그를 가져오고 싶습니다.
참고 항목 Git: 어떤 커밋이 특정 범위의 회선에 닿았는지 확인하십시오.
Git 1.8.4 이후로요git log
다양한 선의 진화를 봐야 합니다.
예를 들어, '보다 낫다'를 보면 어떨까요?git blame
의 출력입니다.여기서 "150 ~ 150+11 행만 살펴봅니다"를 의미합니다.
$ git blame -L 150,+11 -- git-web--browse.sh
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 150) die "The browser $browser is not
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 151) fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 152) fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 153)
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 154) case "$browser" in
81f42f11 git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:38 +0100 155) firefox|iceweasel|seamonkey|iceape)
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 156) # Check version because firefox < 2.0 do
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 157) vers=$(expr "$($browser_path -version)"
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 158) NEWTAB='-new-tab'
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 159) test "$vers" -lt 2 && NEWTAB=''
a0685a4f git-web--browse.sh (Dmitry Potapov 2008-02-09 23:22:22 -0800 160) "$browser_path" $NEWTAB "$@" &
그리고 당신은 현재 155호선의 역사를 알고 싶습니다.
그럼 이번에는ㄴ, ㄴ을 사용하세요.git log
여기 있습니다-L 155,155:git-web--browse.sh
는 "155행의 진화를 파일 이름에서 "155행에서 155행으로 변경"을 의미합니다git-web--browse.sh
를 클릭합니다.
$ git log --pretty=short -u -L 155,155:git-web--browse.sh
commit 81f42f11496b9117273939c98d270af273c8a463
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
web--browse: support opera, seamonkey and elinks
diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -143,1 +143,1 @@
-firefox|iceweasel)
+firefox|iceweasel|seamonkey|iceape)
commit a180055a47c6793eaaba6289f623cff32644215b
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
web--browse: coding style
diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -142,1 +142,1 @@
- firefox|iceweasel)
+firefox|iceweasel)
commit 5884f1fe96b33d9666a78e660042b1e3e5f9f4d9
Author: Christian Couder <chriscool@tuxfamily.org>
Rename 'git-help--browse.sh' to 'git-web--browse.sh'.
diff --git a/git-web--browse.sh b/git-web--browse.sh
--- /dev/null
+++ b/git-web--browse.sh
@@ -0,0 +127,1 @@
+ firefox|iceweasel)
곡괭이를 사용하면 일련의 커밋을 얻을 수 있습니다.
git log -S'the line from your file' -- path/to/your/file.txt
그러면 해당 파일의 텍스트에 영향을 준 모든 커밋이 제공됩니다.파일 이름이 변경된 경우 --follow-parent를 추가할 수 있습니다.
각 편집에서 커밋을 검사하려면 결과를 git show로 파이핑할 수 있습니다.
git log ... | xargs -n 1 git show
Git 1.8.4에 구현된 아래 명령을 사용해 보십시오.
git log -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
그럼, 당신 경우엔요upperLimit
& 리고 & & & 。lowerLimit
감동적인 ★★★★★★★★★★★★★★★★★」line_number
자세한 내용은 여기를 참조하십시오.
@matt의 답변을 단순화합니다.
git blame -L14,15 -- <file_path>
여기에서는 대사에 대한 비난을 될 것입니다.14 to 15
요.
옵션은 매개 변수로 예상하므로 옵션을 사용하여 한 줄에 대한 를 얻을 수 없습니다.
vim-fugative를 사용하면 매우 쉬운 방법입니다.vim에서 파일을 열고 사용할 라인을 선택하십시오.V
, 라고 입력합니다
:Glog
자, 그럼 이제 여러분도 사용하실 수 있습니다.:cnext
그리고요.:cprev
해당 줄이 수정된 파일의 모든 개정판을 확인합니다.아무 때나 입력하세요.:Gblame
, author 및 date info.sha를 보려면 을 클릭하십시오.
이런 건 기본 제공이 안 된 것 같아요.한 줄이 여러 번 변경되는 경우는 드물기 때문에 나머지 파일도 크게 변경되지 않기 때문에 줄 번호가 많이 변경되는 경향이 있습니다.
이름이 변경되지 않은 변수에 대한 할당과 같이 행에 항상 식별할 수 있는 특성이 있을 정도로 운이 좋은 경우, 다음에 대해 정규식 선택을 사용할 수 있습니다.git blame -L
이겁니다.
git blame -L '/variable_name *= */',+1
그러나 이것은 해당 정규식과 일치하는 첫 번째 항목만 찾기 때문에 선을 맞추는 좋은 방법이 없는 경우에는 그다지 도움이 되지 않습니다.
지금은 코드를 쓸 시간이 이 있어요달달식이런식 。git blame -n -L $n,$n $file
. 첫 번째 필드는 이전에 누른 커밋이고 두 번째 필드는 변경될 수 있으므로 해당 커밋의 줄 번호입니다.저것들 들고 뛰어요git blame -n $n,$n $commit^ $file
예를 들어, 파일이 마지막으로 변경되기 전에 커밋에서 동일한 작업을 시작합니다.
(회선을 변경한 마지막 커밋이 병합 커밋인 경우 이 작업은 실패합니다.병합 충돌 해결의 일부로 선이 변경된 경우 이 문제가 발생할 수 있습니다.)
편집: 오늘 2011년 3월부터 이 메일링 목록 게시물을 우연히 발견했습니다.tig
그리고요.git gui
이 작업을 수행하는 데 도움이 되는 기능이 있습니다.git 자체에 대해 이 기능이 고려되었지만 완료되지 않은 것으로 보입니다.git 자 자 、 it 、 it 、 it 、 it 、 , 、 , 、 ,, 。
git 별칭을 정의하는 솔루션이 있습니다. 따라서 다음과 같이 사용할 수 있습니다.
git rblame -M -n -L '/REGEX/,+1' FILE
출력 예는 다음과 같습니다.
00000000 18 (Not Committed Yet 2013-08-19 13:04:52 +0000 728) fooREGEXbar
15227b97 18 (User1 2013-07-11 18:51:26 +0000 728) fooREGEX
1748695d 23 (User2 2013-03-19 21:09:09 +0000 741) REGEXbar
.gitconfig에서 별칭을 정의하거나 다음 명령을 실행할 수 있습니다.
git config alias.rblame !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); echo $line; done' dumb_param
이것은 보기 흉한 원라이너이므로 해독된 동등한 bash 함수는 다음과 같습니다.
git-rblame () {
local commit line
while line=$(git blame "$@" $commit 2>/dev/null); do
commit="${line:0:8}^"
if [ "00000000^" == "$commit" ]; then
commit=$(git rev-parse HEAD)
fi
echo $line
done
}
곡괭이 솔루션(git log --pickaxe-regex -S'REGEX')은 줄 추가/삭제만 제공하며 정규 표현을 포함하는 줄의 다른 변경 사항은 제공하지 않습니다.
이 솔루션의 한계는 git cred가 첫 번째 REGEX 일치만 반환하므로 여러 개의 일치 항목이 있는 경우 재귀가 다른 줄을 따르도록 "점프"할 수 있다는 것입니다.이러한 "점프"를 발견하기 위해 전체 이력 출력을 확인한 다음 기생충 라인을 무시하도록 REGEX를 수정하십시오.
마지막으로, 여기 완전한 diff를 얻기 위해 각 커밋에서 git show를 실행하는 대체 버전이 있습니다.
git config alias.rblameshow !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); git show $commit; done' dumb_param
이렇게 하면 출할것것것것것것 call다 call call라고 합니다.git blame
모든 의미 있는 수정본이 선을 표시하도록 합니다.$LINE
파일의 파일입니다.$FILE
다음을 참조하십시오.
git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE
평소처럼 각 행의 시작 부분에 수정 번호가 표시됩니다.추가할 수 있습니다.
| sort | uniq -c
코드만 이동한 경우줄의 다른 내용에 대해 동일한 커밋 ID가 두 번 표시될 수 있습니다.코드만 이동한 경우 줄의 다른 내용에 대해 동일한 커밋 ID가 두 번 표시될 수 있습니다.좀 더 자세히 분석하기 는 뒤떨어진 비교가 합니다.git blame
인접 커밋에 대한 결과입니다.누구 없어요?
간단하고 쉬운 git prame 명령 라인 시작 및 종료(735,750)입니다.
L735,750(구문)입니다.
git check -L735,750 patient.php (파일 경로 및 이름)를 참조하십시오.
저 같은 경우에는 시간이 지남에 따라 회선 번호가 많이 바뀌었어요.또한 "git flame - L"에서 regex를 지원하지 않는 git 1.8.3을 사용하였습니다. (RHEL7은 여전히 1.8.3을 사용함)
myfile=haproxy.cfg
git rev-list HEAD -- $myfile | while read i
do
git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /"
done | grep "<sometext>"
오넬리너: 네, 맞아요.
myfile=<myfile> ; git rev-list HEAD -- $myfile | while read i; do git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /"; done | grep "<sometext>"
이것은 물론 스크립트나 함수로 만들 수 있습니다.
섞을 수 있습니다git blame
그리고.git log
명령을 사용하여 git prame 명령에서 각 커밋의 요약을 검색하고 추가합니다.다음과 같은 bash + awk 스크립트입니다.커밋 요약을 코드 주석 인라인으로 추가합니다.
git blame FILE_NAME | awk -F" " \
'{
commit = substr($0, 0, 8);
if (!a[commit]) {
query = "git log --oneline -n 1 " commit " --";
(query | getline a[commit]);
}
print $0 " // " substr(a[commit], 9);
}'
한 줄에 다음과 같습니다.
git blame FILE_NAME | awk -F" " '{ commit = substr($0, 0, 8); if (!a[commit]) { query = "git log --oneline -n 1 " commit " --"; (query | getline a[commit]); } print $0 " // " substr(a[commit], 9); }'
줄(줄 번호)의 위치가 파일 기록 내내 동일한 경우, 각 커밋의 줄 내용이 표시됩니다.
git log --follow --pretty=format:"%h" -- 'path/to/file' | while read -r hash; do echo $hash && git show $hash:'path/to/file' | head -n 544 | tail -n1; done
바꿔주세요544
줄넘버, 줄넘버, 줄넘버, 줄넘버, 줄넘버, 줄넘버, 줄넘버, 줄넘버, 줄넘버로요.path/to/file
이겁니다.
언급URL : https://stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a-specific-line-in-a-file 입니다.
'programing' 카테고리의 다른 글
Angular 자습서에서 파이프 및 탭 방법이란 무엇입니까? (0) | 2023.04.25 |
---|---|
특정 형식의 파일만 있는 디렉토리를 어떻게 구분합니까? (0) | 2023.04.25 |
다양한 MessageBoxImage 또는 MessageBoxIcon의 이미지를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.25 |
Kotlin: 목록 캐스팅을 사용하는 방법:선택되지 않은 캐스트: kotlin.collections입니다.kotlin.colutions에 등록합니다.목록입니다. (0) | 2023.04.25 |
실패할 때까지 셸 명령을 반복적으로 실행하시겠습니까? (0) | 2023.04.25 |