push - Come cercare tutti i commit Git e Mercurial nel repository per una determinata stringa?




tag -u (9)

Ho un repository Git con poche filiali e commit penzolanti. Mi piacerebbe cercare tutti questi commit nel repository per una stringa specifica.

So come ottenere un registro di tutti i commit nella cronologia, ma questi non includono rami o blob penzolanti, solo la storia di HEAD. Voglio averli tutti, per trovare un impegno specifico che è stato perso.

Mi piacerebbe anche sapere come farlo in Mercurial, come sto considerando il passaggio.


Answers

Non so di git, ma in Mercurial avrei solo collegato l'output di hg log ad uno script di tipo sed / perl / qualunque per cercare quello che stai cercando. Puoi personalizzare l'output di hg log usando un modello o uno stile per rendere più facile la ricerca, se lo desideri.

Ciò includerà tutte le filiali nominate nel repository. Mercurial non ha qualcosa di simile a blob penzoloni afaik.



Basandosi sulla risposta di rq, ho trovato che questa linea fa quello che voglio:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

Quale riferirà l'ID di commit, il nome del file e visualizzerà la linea corrispondente, in questo modo:

91ba969:testFile:this is a test

... Qualcuno è d'accordo sul fatto che questa sarebbe una buona opzione da includere nel comando standard git grep?


Con Mercurial fai a

$ hg grep "search for this" [file...]

Ci sono altre opzioni che restringono la gamma di revisioni che vengono cercate.


Qualsiasi comando che accetta riferimenti come argomenti accetterà l'opzione --all documentata nella pagina man per git rev-list come segue:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

Quindi, ad esempio git log -Sstring --all mostrerà tutti i commit che menzionano string e che sono accessibili da un ramo o da un tag (presumo che i tuoi commit penzolanti siano almeno nominati con un tag).


In Mercurial usi hg log --keyword per cercare parole chiave nei messaggi di commit e hg log --user per cercare un particolare utente. Vedi hg help log per altri modi per limitare il registro.


Per aggiungere solo un'altra soluzione non ancora menzionata, ho dovuto dire che usare la casella di ricerca grafica di gitg era la soluzione più semplice per me. Seleziona la prima occorrenza e puoi trovare la successiva con Ctrl-G.


In aggiunta alla risposta richq dell'uso di git log -g --grep=<regexp> o git grep -e <regexp> $(git log -g --pretty=format:%h) : dai un'occhiata ai seguenti post del blog di Junio ​​C Hamano, attuale manutentore di git

Sommario

Sia git grep che git log --grep sono orientati alla linea , in quanto cercano le linee che corrispondono al modello specificato.

Puoi usare git log --grep=<foo> --grep=<bar> (o git log --author=<foo> --grep=<bar> che si traduce internamente in due --grep ) per trovare commit che abbinare uno dei modelli (implicito OR semantico).

Essendo orientato alla linea, l'utile semantica di AND è usare git log --all-match --grep=<foo> --grep=<bar> per trovare il commit che ha sia la corrispondenza della linea che la corrispondenza della prima riga da qualche parte.

Con git grep puoi combinare più pattern (tutti che devono utilizzare il modulo -e <regexp> ) con - --or (che è il valore predefinito), --and , --and --not , ( e ) . Per grep --all-match significa che il file deve avere linee che corrispondono a ciascuna delle alternative.


Quando cloni un repository tutte le informazioni dei rami vengono effettivamente scaricate ma i rami sono nascosti. Con il comando

$ git branch -a

puoi mostrare tutti i rami del repository e con il comando

$ git checkout -b branchname origin/branchname

è quindi possibile "scaricarli" manualmente uno alla volta.

Tuttavia, c'è un modo molto più pulito e veloce, anche se è un po 'complicato. Hai bisogno di tre passaggi per realizzare questo:

  1. Primo passo

    crea una nuova cartella vuota sul tuo computer e clona una copia speculare della cartella .git dal repository:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    il repository locale all'interno della cartella my_repo_folder è ancora vuoto, c'è solo una cartella .git nascosta ora che puoi vedere con un comando "ls -alt" dal terminale.

  2. Secondo passo

    commuta questo repository da un repository vuoto (nudo) ad un repository regolare cambiando il valore booleano "bare" delle configurazioni git su false:

    $ git config --bool core.bare false
    
  3. Terzo passo

    Prendi tutto ciò che è all'interno della cartella corrente e crea tutti i rami sulla macchina locale, quindi rendilo un normale repo.

    $ git reset --hard
    

Quindi ora puoi semplicemente digitare il comando git branch e puoi vedere che tutti i rami sono stati scaricati.

Questo è il modo rapido in cui è possibile clonare un repository git con tutti i rami contemporaneamente, ma non è qualcosa che si vuole fare per ogni singolo progetto in questo modo.





git mercurial