Las respuestas anteriores no para algunos casos de uso donde se necesita excluir el texto movido (por ejemplo, si muevo una función en el código o párrafo en látex más abajo en el documento, no quiero contar todos los cambios que !)
Para eso, también puede calcular el número de líneas duplicadas y excluir aquellas de su consulta si hay demasiadas duplicaciones.
Por ejemplo, sobre la base de las otras respuestas, que puedo hacer:
git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs
calcula el número de palabras duplicadas en el diff, donde sha
es su confirmación.
Puede hacer esto para todas las confirmaciones en el último día (desde el 6 de la mañana) por:
for sha in $(git rev-list --since="6am" master | sed -e '$ d'); do
echo $(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^+[^+]"|wc -w|xargs),\
$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^-[^-]"|wc -w|xargs),\
$(git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs)
done
Prints: añadido, suprimido, duplicados
(Tomo el diff línea de duplicados, ya que excluye los tiempos en los que git diff
intenta ser demasiado inteligente, y asume que realmente acabas de cambiar el texto en lugar de moverlo. También descuenta instancias donde una sola palabra se cuenta como un duplicado.)
O, si quieres ser sofisticado al respecto , Puede excluir compromete por completo si hay más de un 80% la duplicación, y que resume el resto:
total=0
for sha in $(git rev-list --since="6am" master | sed -e '$ d'); do
added=$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^+[^+]"|wc -w|xargs)
deleted=$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^-[^-]"|wc -w|xargs)
duplicated=$(git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs)
if [ "$added" -eq "0" ]; then
changed=$deleted
total=$((total+deleted))
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changed:" $changed
elif [ "$(echo "$duplicated/$added > 0.8" | bc -l)" -eq "1" ]; then
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changes counted:" 0
else
changed=$((added+deleted))
total=$((total+changed))
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changes counted:" $changed
fi
done
echo "Total changed:" $total
tengo este script para hacerlo aquí: https://github.com/MilesCranmer/git-stats.
Esto muestra:
➜ bifrost_paper git:(master) ✗ count_changed_words "6am"
added: 38, deleted: 76, duplicated: 3, changes counted: 114
added: 14, deleted: 19, duplicated: 0, changes counted: 33
added: 1113, deleted: 1112, duplicated: 1106, changes counted: 0
added: 1265, deleted: 1275, duplicated: 1225, changes counted: 0
added: 4207, deleted: 4208, duplicated: 4391, changes counted: 0
Total changed: 147
El compromete donde estoy sólo va a desplazarse alrededor de las cosas son evidentes, por lo que no cuentan los cambios. Contar todo lo demás y me dice el número total de palabras cambiadas.
Eso es realmente un excelente uso: git es un rastreador de contenido. Y no es tan inusual: eche un vistazo a la encuesta de git del año pasado https://git.wiki.kernel.org/index.php/GitSurvey2009#07._I_use_Git_for_.28check_all_that_apply.29: – Cascabel