2013-01-14 5 views
1

이것은 this question와 관련이 있습니다.하지만 다른 질문이 필요합니다.sed : git --line-porcelain 출력

git blame --line-porcelain의 출력은

27ce485030bf872158ceb011e6bd775d2ead5eeb 9 36 1 
author Joao Tavora 
author-time 1358179206 
committer Joao Tavora 
committer-time 1358179206 
summary initial commit 
boundary 
filename test.el 
    (defun AB (space task next.task) 
242020d0de6363d48d32465299d07239f0a9940f 19 37 1 
author Joao Tavora 
author-time 1358179709 
committer Joao Tavora 
committer-time 1358179709 
summary reinstate declare 
previous 11da1748d905aa9520ee3d6d9ac6a8712db0040f test.el 
filename test.el 
     (declare (ignore space)) 
cbfa1ec071dd30a27be82dd041ccc9c384e5ff60 11 38 2 
author Joao Tavora 
author-time 1358179273 
committer Joao Tavora 
committer-time 1358179273 
summary use thingy 
previous 69af7ace6e2b6c006c86e4fd91bf3c15ff8cec07 test.el 
filename test.el 
     (if (and (some.task.p (task (IP.TASK-thingy task))) 

가 어떻게 그냥 샤 를 저지 필터링 toparse SED (또는 그렙 또는 AWK)를 사용하는 것 같은 것을하고 comitter 시간인가? 위의 예제에서 :

27ce485030bf872158ceb011e6bd775d2ead5eeb 1358179206 
242020d0de6363d48d32465299d07239f0a9940f 1358179709 
cbfa1ec071dd30a27be82dd041ccc9c384e5ff60 1358179273 

perl one-liner가 괜찮을지라도 나는 루비에 의존하지 않을 것입니다.

답변

4

당신 (GNU이 나오지도)에 대한이 작동 될 수 있습니다

sed -r '/^[0-9a-f]{40}\b/!d;:a;/\ncommitter-time\b/bb;$!{N;ba};:b;s/\s+.*(\s.*)/\1/' file 
+0

whoa nice! 나는 곧 받아 들일 것이다. 누군가 제너릭 솔루션을 얻을 수 있을지 궁금하다. 내 코드가 커밋처럼 보이는 것을 포함 할 때 깨지지 않는 코드가있다. :-) –

+0

이 sed 명령을 변경하여 어떻게 작성자 메일을 concat으로 바꾸는가? 해시를 커밋 하시겠습니까 – user3041539

0

이 완전히 잘못된 일 수 있지만이 시도 할 수 있습니다 :

git shortlog --format="%H %ct" -- <filename> 

또한 명령 후 파이프 tail -n +2과 라인의 처음 몇을 차단 할 수 있습니다. 허락하신다면, 이것은 줄 단위의 변경 사항을 보여주지는 않지만 원하는 부분이 정확히 무엇인지 모르겠습니다.

+0

정말'--line-porcelain'의 결과를 파싱하고 싶습니다. –

0

나는

git blame -l -e -t -- file-to-blame | awk '{print $1 " " $3}' 

거의 내 문제를 해결하지만, 내가 생각하는 저자 시간을 그렇게 사실을 발견했습니다. 그리고 저는 --line-porcelain 출력을 구문 분석하는 것을 배우고 싶습니다.