retroceder - Usando git diff, ¿cómo puedo obtener números de líneas adicionales y modificados?
historial en git (10)
Aquí hay una función bash para calcular los números de línea resultantes de un diff:
diff-lines() {
local path=
local line=
while read; do
esc=$''/033''
if [[ $REPLY =~ ---/ (a/)?.* ]]; then
continue
elif [[ $REPLY =~ /+/+/+/ (b/)?([^[:blank:]$esc]+).* ]]; then
path=${BASH_REMATCH[2]}
elif [[ $REPLY =~ @@/ -[0-9]+(,[0-9]+)?/ /+([0-9]+)(,[0-9]+)?/ @@.* ]]; then
line=${BASH_REMATCH[2]}
elif [[ $REPLY =~ ^($esc/[[0-9;]+m)*([/ +-]) ]]; then
echo "$path:$line:$REPLY"
if [[ ${BASH_REMATCH[2]} != - ]]; then
((line++))
fi
fi
done
}
Puede producir resultados como:
$ git diff | diff-lines
http-fetch.c:1: #include "cache.h"
http-fetch.c:2: #include "walker.h"
http-fetch.c:3:
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:5: {
http-fetch.c:6:+ const char *prefix;
http-fetch.c:7: struct walker *walker;
http-fetch.c:8: int commits_on_stdin = 0;
http-fetch.c:9: int commits;
http-fetch.c:19: int get_verbosely = 0;
http-fetch.c:20: int get_recover = 0;
http-fetch.c:21:
http-fetch.c:22:+ prefix = setup_git_directory();
http-fetch.c:23:+
http-fetch.c:24: git_config(git_default_config, NULL);
http-fetch.c:25:
http-fetch.c:26: while (arg < argc && argv[arg][0] == ''-'') {
fetch.h:1: #include "config.h"
fetch.h:2: #include "http.h"
fetch.h:3:
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);
fetch.h:5:
fetch.h:6: void start_fetch(const char* uri);
fetch.h:7: bool fetch_succeeded(int status_code);
de un diff como este:
$ git diff
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == ''-'') {
diff --git a/fetch.h b/fetch.h
index 5fd3e65..d43e0ca 100644
--- a/fetch.h
+++ b/fetch.h
@@ -1,7 +1,7 @@
#include "config.h"
#include "http.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
+int main(int argc, const char **argv);
void start_fetch(const char* uri);
bool fetch_succeeded(int status_code);
Si solo desea mostrar líneas añadidas / eliminadas / modificadas, y no el contexto circundante, puede pasar -U0
a git diff:
$ git diff -U0 | diff-lines
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:6:+ const char *prefix;
http-fetch.c:22:+ prefix = setup_git_directory();
http-fetch.c:23:+
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);
Es robusto contra los códigos de color ANSI, por lo que puede pasar --color=always
a git diff para obtener la codificación de color habitual para las líneas añadidas / eliminadas.
La salida se puede grep fácilmente:
$ git diff -U0 | diff-lines | grep ''main''
http-fetch.c:4:+int main(int argc, const char **argv)
fetch.h:4:+int main(int argc, const char **argv);
En tu caso, git diff -U0
daría:
$ git diff -U0 | diff-lines
test.txt:2:+new line here
test.txt:3:+another new line
test.txt:6:-will be removed
test.txt:6:-git repo
test.txt:6:+git
Si solo desea los números de línea, cambie el echo "$path:$line:$REPLY"
para que solo se echo "$line"
y canalice la salida a través de uniq
.
Suponiendo que tengo un archivo de texto
alex
bob
matrix
will be removed
git repo
y lo he actualizado para ser
alex
new line here
another new line
bob
matrix
git
Aquí, he agregado el número de líneas (2,3) y el número de línea actualizado (6)
¿Cómo puedo obtener información sobre estos números de línea usando git diff o cualquier otro comando de git?
Aquí hay una función de bash improvisada:
echo ${f}:
for n in $(git --no-pager blame --line-porcelain $1 |
awk ''/author Not Committed Yet/{if (a && a !~ /author Not Committed Yet/) print a} {a=$0}'' |
awk ''{print $3}'') ; do
if (( prev_line > -1 )) ; then
if (( "$n" > (prev_line + 1) )) ; then
if (( (prev_line - range_start) > 1 )) ; then
echo -n "$range_start-$prev_line,"
else
echo -n "$range_start,$prev_line,"
fi
range_start=$n
fi
else
range_start=$n
fi
prev_line=$n
done
if (( "$range_start" != "$prev_line" )) ; then
echo "$range_start-$prev_line"
else
echo "$range_start"
fi
Y termina luciendo así:
views.py:
403,404,533-538,546-548,550-552,554-559,565-567,580-582
Configure una herramienta de diferencia externa que le mostrará los números de línea. Por ejemplo, esto es lo que tengo en mi configuración global de git:
diff.guitool=kdiff3
difftool.kdiff3.path=c:/Program Files (x86)/KDiff3/kdiff3.exe
difftool.kdiff3.cmd="c:/Program Files (x86)/KDiff3/kdiff3.exe" "$LOCAL" "$REMOTE"
Vea esta respuesta para más detalles: https://.com/q/949242/526535
Este es probablemente un recuento bastante preciso de líneas modificadas:
git diff --word-diff <commit> |egrep ''(?:/[-)|(?:/{/+)'' |wc -l
Además, aquí hay una solución para números de línea en su diff: https://github.com/jay/showlinenum
Números de línea de todas las líneas no comprometidas (agregadas / modificadas):
git blame <file> | grep -n ''^0/{8/} '' | cut -f1 -d:
Ejemplo de salida:
1
2
8
12
13
14
No es exactamente lo que estaba pidiendo, pero el git blame TEXTFILE
puede ayudar.
Puede usar git diff
junto con el parámetro shortstat
para mostrar el no de líneas modificadas.
Para el número de líneas modificadas (en un archivo que ya está en el repositorio) desde su último compromiso
git diff HEAD --shortstat
Saldrá algo similar a
1 file changed, 4 insertions(+)
Tuve el mismo problema, así que escribí un script gawk que cambia la salida de git diff para anteponer el número de línea para cada línea. A veces me resulta útil cuando necesito modificar el árbol de trabajo, aunque no se limita a eso. Tal vez es útil para alguien aquí?
$ git diff HEAD~1 |showlinenum.awk
diff --git a/doc.txt b/doc.txt
index fae6176..6ca8c26 100644
--- a/doc.txt
+++ b/doc.txt
@@ -1,3 +1,3 @@
1: red
2: blue
:-green
3:+yellow
Puedes descargarlo desde aquí:
https://github.com/jay/showlinenum
Utilizo la opción --unified=0
de git diff
.
Por ejemplo, git diff --unified=0 commit1 commit2
saca la diferencia:
Debido a la opción --unified=0
, la salida de diff muestra 0 líneas de contexto; en otras palabras, muestra exactamente las líneas cambiadas .
Ahora puede identificar las líneas que comienzan con ''@@'' y analizarlas según el patrón:
@@ -startline1,count1 +startline2,count2 @@
Volviendo al ejemplo anterior, para el archivo WildcardBinding.java, comience desde la línea 910, se borran 0 líneas. Comience desde la línea 911, se agregan 4 líneas.
git diff --stat
te mostrará la salida que obtienes al cometer cosas a las que te refieres, supongo.
git diff --stat
Para mostrar exactamente los números de línea que se han cambiado, puede usar
git blame -p <file> | grep "Not Committed Yet"
Y la línea modificada será el último número antes del paréntesis final en el resultado. No es una solución limpia :(