subversion - tortoise>- svn
encontrar svn revisiĆ³n por texto eliminado (5)
¿Hay alguna manera de encontrar una revisión SVN buscando una cadena de texto que se eliminó en el archivo? Sé el texto exacto para buscar y qué archivo buscar, pero hay cientos de revisiones.
Basándome en el guión de khmarbaise, se me ocurrió esto:
#!/bin/bash
file="$1"
REVISIONS=`svn log $file -q --stop-on-copy |grep "^r" | cut -d"r" -f2 | cut -d" " -f1`
for rev in $REVISIONS; do
prevRev=$(($rev-1))
difftext=`svn diff --old=$file@$prevRev --new=$file@$rev | tr -s " " | grep -v " -/ /- " | grep -e "$2"`
if [ -n "$difftext" ]; then
echo "$rev: $difftext"
fi
done
pase el nombre del archivo y la cadena de búsqueda en la línea de comando:
xyz.sh "filename" "text to search"
svn diff me da tanto el rev donde se agrega y dónde se borra; Lo dejaré aquí en caso de que sea útil para cualquiera. Hay un mensaje de error en la última revisión del que no sé cómo deshacerme (todavía tengo mucho que aprender :) pero los números de rev son correctos.
Hizo una versión PHP simple de la respuesta aceptada para ejecutar en la línea de comando:
<?php
$file = $argv[1];
$searchfor = $argv[2];
if (!$file) die(''Please specify file name to search through as the first argument.'');
if (!$searchfor) die(''Please specify text to search for as the second argument.'');
echo PHP_EOL .''Searching ''. $file .'' for: ''. $searchfor . PHP_EOL . PHP_EOL;
$cmd = ''svn log ''. $file .'' -q'';
$output = array();
exec($cmd, $output);
// Find all revisions
$all_revisions = array();
foreach ($output as $line) {
if (preg_match("/^r(//d+) /", $line, $match)) {
$all_revisions[] = $match[1];
}
}
echo ''Checking ''. count($all_revisions) .'' revisions...''. PHP_EOL . PHP_EOL;
// Get diff for each revision
foreach ($all_revisions as $keykey => $rev) {
$prev_rev = $all_revisions[$keykey+1];
$cmd = ''svn diff --old=''. $file .''@''. $prev_rev .'' --new=''. $file .''@''. $rev;
$output = array();
exec($cmd, $output);
// Check if string is present
$str = implode(PHP_EOL, $output);
if (strpos($str, $searchfor) !== false) {
echo ''Found in revision ''. $prev_rev .'' but removed from ''. $rev .''.''. PHP_EOL;
break;
} else {
echo ''Not found in revision ''. $rev .''.''. PHP_EOL;
}
}
echo ''Done.''. PHP_EOL;
Ejecute el script con el siguiente comando:
php scriptname.php "filetosearchthrough.php" "text to search for"
La secuencia de comandos podría ser ajustada, pero hace lo que necesita. Tenga en cuenta que lleva mucho tiempo buscar en muchas revisiones.
Me gusta blameall.py .
Su salida para un archivo contiene todas las líneas existentes y eliminadas para que pueda ver las líneas eliminadas en el contexto circundante.
Si no puede o no quiere usar scripts:
svn log --diff [path_to_file] > log.txt
(el [path_to_file] es opcional, si no lo especifica, incluirá todos los archivos en la carpeta y subcarpetas actuales)
Allí puede encontrar todas las líneas agregadas (comienzan con +), todas las líneas eliminadas (comienzan con -) y algunas líneas de contexto (comienzan con un espacio). Las líneas modificadas aparecerán con + y repetidas con -
Puede procesar el archivo resultante con cualquier editor de texto decente (por ejemplo, Notepad ++), grep, scripts o cualquier cosa que desee.
solo una pequeña secuencia de comandos bash que filtra las líneas modificadas ... Si cambia pom.xml en su archivo, con la URL complementaria puede tener lo que necesita ... (Si tiene un sistema como Unix). Coloque lo siguiente en un archivo de script (xyz.sh) y realice un filtro en la salida.
#!/bin/bash
REVISIONS=`svn log pom.xml -q|grep "^r" | cut -d"r" -f2 | cut -d" " -f1`
for rev in $REVISIONS; do
svn blame -r$rev:$rev pom.xml | tr -s " " | grep -v " -/ /- "
done
xyz.sh | grep "Text you are searching for"
La impresión será algo así como:
256 ......
El 256 es la revisión en la que se realizó el cambio.