2011-05-10 3 views
9

Tengo que escribir un script que seGit: quiere iterar a través de todos los envíos en rama, y ​​archivos de lista en cada confirmación

  1. iterar a través de todos los compromete en una rama, comenzando por el más reciente
  2. para cada confirmación, itere a través de todos los archivos en la confirmación
  3. si encuentra un archivo de tipo hbm.xml, almacena la confirmación en el archivo y sale.

que tienen una secuencia de comandos para el paso 2:

for i in `git show --pretty="format:" --name-only SHA1 | grep '.*\.hbm\.xml' `; do 
    # call script here..... 
    exit 
done 

Ahora, necesito averiguar el paso 1.

Respuesta

13

Something li ke:

for commit in $(git rev-list $branch) 
do 
    if git ls-tree --name-only -r $commit | grep -q '\.hbm\.xml$'; then 
     echo $commit 
     exit 0 
    fi 
done 

Tenga en cuenta que git show sólo habrá una lista de los archivos que han cambiado en esa confirmación, si desea saber si hay un camino que coincide con un patrón determinado en una de comprometerse es necesario utilizar algo así como git ls-tree.

+0

Gracias, Charles. De hecho, solo quiero el commit donde se cambiaron los archivos. – Jacko

8

git rev-list mostrará una lista de todas las revisiones accesible desde un commit dado, en orden cronológico inverso, para que pueda pasarle un nombre de sucursal para obtener la lista de esa rama al revés:

$ git rev-list master                      
a6060477b9dca7021bc34f373360f75064a0b728 
7146d679312ab5425fe531390c6bb389cd9c8910 
53e3d0c1e1239d0e846b3947c4a6da585960e02d 
a91b80b91e9890f522fe8e83feda32b8c6eab7b6 
... 
Cuestiones relacionadas