2016-08-01 22 views
11

"20" (veya aralık)
için "TEXT" yazısını aramam gerekiyor. Eşleşme yaptığım dosya adını ve satır numarasını görmem gerekiyor.Git metin içinde aranan metin için arama yap

Not:
Yük içeriğini aramak istiyorum, ancak bu projeye ilişkin bir taahhütte bulunmayın. git grep diyor. kaydedilmesini içeriğin By
ben git log --raw -GTEXT kullandığını var en yakın git diff HEAD^^^..HEAD

kullanarak gördüğüm kadarıyla demek, benim "METİN" içeriği işlemek ve dosya adlarını gösterir içeren taahhüt gösterir. Hala satır numarası yok.

Ve bazı boru
git diff $(git log -n 20 --pretty=format:%h -GTEXT) | grep -E 'TEXT|\+\+\+|@@\s'
Hala biraz ağız ve daha iyi bir çözüm varsa gürültü bir sürü, lütfen cevap ile

.

+0

İşlemi çeşitlendirmek için git diff' gibi bir şey hayal ediyorum, daha sonra 'grep' –

+1

'ya pipetle' git log -g --grep = TEXT'? – Shravan40

+0

@ Shravan40 '--grep''i kaçırıyor musunuz? –

cevap

7

alın son 20 kaydedilmesini: Sonra yineleme

declare -A COMMITS # Declare associative array 
COMMITNUMBER=0 

while read -r line; do # For each line, do 
    # Add 1 to COMMITNUMBER, if the current line contains "commit [0-9a-f]* (e.g., new associative array index for each commit) 
    # As this'll happen straight way, our array is technically 1-indexed (starts from "${COMMITS[1]}", not "${COMMITS[0]}") 
    REGEX="commit\s[0-9a-f]*" 
    [[ "$line" =~ $REGEX ]] && COMMITNUMBER=$((COMMITNUMBER+1)) 

    # Append the commit line to the index 
    COMMITS[$COMMITNUMBER]="${COMMITS[$COMMITNUMBER]} $line" 
done < <(git log -n 20) 

:

git log -n 20 

bir ilişkisel dizi her Get

for i in "${!COMMITS[@]}" 
do 
    echo "key : $i" 
    echo "value: ${COMMITS[$i]}" 
done 

Bu aşağıda benzer bir çıktı verir:

key : 1 
value: commit 778f88ec8ad4f454aa5085cd0c8d51441668207c Author: Nick <[email protected]> Date: Sun Aug 7 11:43:24 2016 +0100 Second commit 
key : 2 
value: commit a38cd7b2310038af180a548c03b086717d205a61 Author: Nick <[email protected]> Date: Sun Aug 7 11:25:31 2016 +0100 Some commit 

Şimdi grep ya da bir şey kullanarak döngü içinde her arama ve neye ihtiyacınız eşleşebilir: Toplamda

for i in "${!COMMITS[@]}" 
do 
    REGEX="Date:[\s]*Sun\sAug\7" 
    if [[ "${COMMITS[$i]}" =~ $REGEX ]]; then 
     echo "The following commit matched '$REGEX':" 
     echo "${COMMITS[$i]}" 
    fi 
done 

:

search_last_commits() { 
    [[ -z "$1" ]] && echo "Arg #1: No search pattern specified" && return 1 
    [[ -z "$2" ]] && echo "Arg #2: Number required for number of commits to return" && return 1 

declare -A COMMITS # Declare associative array 
COMMITNUMBER=0 

    while read -r line; do # For each line, do 
     # Add 1 to COMMITNUMBER, if the current line contains "commit [0-9a-f]* (e.g., new associative array index for each commit) 
     # As this'll happen straight way, our array is technically 1-indexed (starts from "${COMMITS[1]}", not "${COMMITS[0]}") 
     REGEX="commit\s[0-9a-f]*" 
     [[ "$line" =~ $REGEX ]] && COMMITNUMBER=$((COMMITNUMBER+1)) 

     # Append the commit line to the index 
     COMMITS[$COMMITNUMBER]="${COMMITS[$COMMITNUMBER]} $line" 
    done < <(git log -n $2) 

    for i in "${!COMMITS[@]}" 
    do 
     REGEX="$1" 
     if [[ "${COMMITS[$i]}" =~ $REGEX ]]; then 
      echo "The following commit matched '$REGEX':" 
      echo "${COMMITS[$i]}" 
     fi 
    done 
} 

EDIT:

Kullanımı:

search_last_commits <search-term> <last-commits-quantity> 

Örnek:

search_last_commits "Aug" 20 
0

kolay yolu: GIT_SEQUENCE_EDITOR=: git rebase --exec "git rev-parse HEAD; git --no-pager grep -n 'TEXT_TO_FIND'; echo " -i HEAD~20

Detayları:

git rev-parse HEAD - Geçerli sha1

git --no-pager grep -n 'TEXT_TO_FIND' göstermek - Metni bulmak için grep komutunu, buradan kullanabilirsiniz başka bir komut (düzenli grep vb. gibi))

echo

- Bir komut her taahhüt arasındaki boş satır yazdırmak ve dönüş değeri her zaman Tamam olduğundan emin olmak için

HEAD~20 - kaç geri taahhüt) Ben 20 yaptım burada (Aramak istediğiniz do

Bazı yararlı cevaplar: link1link2

+0

Neden yeniden oluşturuluyor? – logcat

+0

Ben aslında "kendim" üzerine yeniden inşa ediyorum, bu yüzden tüm taahhütler aynı kalacak. Bu, her bir taahhüt ve taahhütte komutları çalıştırmak için bir numaradır .. –

+0

Bunun, bu 20 taahhüt için yeni karmalar yaratacağını biliyorsunuz, değil mi? – logcat

0

bu deneyin:

echo `git log --raw --pretty=format:%h -GTEXT | xargs | awk '{print $NF}'` ;grep -ni 'MAX_STR_LEN' $(git log --raw --pretty=format:%h -GMAX_STR_LEN | xargs | awk '{print $NF}') 

Bu, tek taahhütlü sürüm için benim için çalışıyor. Hedefinize ulaşmak için n sayıda kez döngü yapabilirsiniz.