svn - tutorial - examinar el historial del archivo eliminado
svn no es una copia de trabajo (17)
Además de la respuesta de Dustin, si solo quiere examinar los contenidos y no verificarlos, en su ejemplo puede:
$ git show 8d4a1f^:slosh.tac
the: separa una revisión y una ruta en esa revisión, solicitando efectivamente una ruta específica en una revisión específica.
Si elimino un archivo en Subversion, ¿cómo puedo ver su historial y contenido? Si trato de hacer svn cat
o svn log
en un archivo inexistente, se queja de que el archivo no existe.
Además, si quisiera resucitar el archivo, ¿debería simplemente svn add
?
(Pregunté específicamente sobre Subversion, pero también me gustaría saber cómo Bazaar, Mercurial y Git manejan este caso también).
Ah, dado que estoy aprendiendo a usar Bazar, es algo que probé. Sin éxito, parece que no puede registrar y anotar archivos eliminados actualmente ... :-(
Intentó:
> bzr log -r 3 Stuff/ErrorParser.hta
bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta
pero curiosamente (y afortunadamente) puedo hacerlo:
> bzr cat -r 3 Stuff/ErrorParser.hta
y:
> bzr diff -r 2..3 Stuff/ErrorParser.hta
y como se sugiere en el error anterior:
> bzr log -v | grep -B 1 ErrorParser
(ajuste el parámetro -B
( --before-context
) según sea necesario).
Cuando desee ver archivos antiguos, realmente debe saber la diferencia entre:
svn cat http://server/svn/project/file -r 1234
y
svn cat http://server/svn/project/file@1234
La primera versión analiza la ruta que ahora está disponible como http://server/svn/project/file y recupera ese archivo tal como estaba en la revisión 1234. (Por lo tanto, esta sintaxis no funciona después de eliminar un archivo).
La segunda sintaxis obtiene el archivo que estaba disponible como http://server/svn/project/file en la revisión 1234. Por lo tanto, esta sintaxis sí funciona en los archivos eliminados.
Incluso puede combinar estos métodos para recuperar un archivo que estaba disponible en la revisión 2345 como http://server/svn/project/file pero con los contenidos como en 1234 con:
svn cat http://server/svn/project/file@2345 -r 1234
Debería especificar una revisión.
svn log -r <revision> <deleted file>
El póster ha hecho 3 preguntas aquí:
- ¿Cómo veo el historial de un archivo eliminado en Subversion?
- ¿Cómo miro el contenido de un archivo eliminado en Subversion?
- ¿Cómo resucito un archivo eliminado en Subversion?
Todas las respuestas que veo aquí son para las preguntas 2 y 3.
La respuesta a la pregunta 1 es:
svn log http://server/svn/project/file@1234
Aún necesita obtener el número de revisión para cuando el archivo haya existido por última vez, lo cual es claramente respondido por otros aquí.
Escribí un script php que copia el registro svn de todos mis repositorios en una base de datos mysql. Ahora puedo hacer búsquedas de texto completo en mis comentarios o nombres de archivos.
No es nada particularmente especial en git. Si conoce el nombre del archivo, puede averiguar el cambio que lo eliminó con el registro:
git log -n 1 -- filename
Luego puede usar esa confirmación para obtener el archivo tal como existía antes de la eliminación.
git checkout [last_revision]^ filename
Ejemplo:
dhcp-120:/tmp/slosh 587% ls -l slosh.tac
ls: slosh.tac: No such file or directory
dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
Author: Dustin Sallings <[email protected]>
Date: Mon Dec 15 11:25:00 2008 -0800
Get rid of a .conf and replace it with .tac.
dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
dhcp-120:/tmp/slosh 590% ll slosh.tac
-rw------- 1 dustin wheel 822 Dec 30 12:52 slosh.tac
Tenga en cuenta que esto realmente no vuelve a poner el archivo en control de revisión. Simplemente suelta el archivo como existía en su estado final en la ubicación actual. Luego puede agregarlo o simplemente inspeccionarlo o lo que sea desde ese punto.
Para obtener el registro de un archivo eliminado, use
svn log -r lastrevisionthefileexisted
Si quieres resucitar el archivo y conservar su historial de versiones, usa
svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file
Si solo desea el contenido del archivo pero no ha sido versionado (por ejemplo, para una inspección rápida), use
svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file
En cualquier caso, NO use ''svn up'' para recuperar un archivo eliminado.
Primero, encuentre el número de revisión donde se eliminó el archivo:
svn log -v > log.txt
Luego busque en log.txt (no es un gurú SVN, así que no conozco una mejor manera) para una línea con
D <deleted file>
y ver qué revisión fue esa. Luego, como en las otras respuestas, resucite el archivo usando la revisión anterior.
Puede encontrar la última revisión que proporciona el archivo utilizando la búsqueda binaria. He creado un script simple /bin/bash
para esto:
function svnFindLast(){
# The URL of the file to be found
local URL="$1"
# The SVN revision number which the file appears in (any rev where the file DOES exist)
local r="$2"
local R
for i in $(seq 1 "${#URL}")
do
echo "checkingURL:''${URL:0:$i}''" >&2
R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)"
echo "R=$R" >&2
[ -z "$R" ] || break
done
[ "$R" ] || {
echo "It seems ''$URL'' is not in a valid SVN repository!" >&2
return -1
}
while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ]
do
T="$(($(($R + $r)) / 2))"
if svn log "${URL}@${T}" >/dev/null 2>&1
then
r="$T"
echo "r=$r" >&2
else
R="$T"
echo "R=$R" >&2
fi
done
echo "$r"
}
Si desea ver el historial de un archivo antes de que se renombre, entonces como se menciona en un comentario aquí , puede usar
git log --follow -- current_file_name
Si no conoce la ruta del archivo eliminado, resulta que puede buscarlo en el comando de lo contrario demasiado pesado svn log
:
svn log --search <deleted_file_or_pattern> -v
Es probable que el comando esté golpeando al servidor tanto como lo haría sin la opción de búsqueda, pero al menos el resto de los recursos involucrados (incluidos los ojos) se sentirían un poco aliviados, ya que eso le indicará en qué revisión se eliminó ese archivo. Luego, puede seguir las otras sugerencias (principalmente usando el mismo comando svn log
, pero ya en una ruta definida).
Suponga que su archivo fue nombrado como ~ / src / a / b / c / deleted.file
cd ~/src/a/b/c # to the directory where you do the svn rm or svn mv command
#cd ~/src # if you forget the correct directory, just to the root of repository
svn log -v | grep -w -B 9 deleted.file | head # head show first 10 lines
muestra de salida, lo encontré en r90440
...
r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines
Changed paths:
M /src/a/b/c/foo
M /src/a/b/c/bar
D /src/a/b/c/deleted.file
cópielo de vuelta a la versión anterior (90439 = 90440-1)
svn cp URL_of_deleted.file@90439 .
Una solución que usa solo la GUI:
Si conoce el nombre del archivo, pero no conoce su último número de revisión o incluso su ruta:
- Desde el navegador Repo haz un "Mostrar registro" en la raíz
- Haga clic en "Mostrar todo" (en la parte inferior del diálogo de registro)
- Escriba el nombre del archivo en el cuadro de texto Filtro (en la parte superior del cuadro de diálogo de registro)
Esto mostrará solo aquellas revisiones donde el archivo fue agregado / modificado / eliminado. Este es tu historial del archivo.
Tenga en cuenta que si el archivo fue eliminado al eliminar una de sus carpetas principales, no tendrá una entrada ''eliminada'' en el registro (y entonces la solución de mjy no funcionará). En este caso, su entrada más reciente en el registro filtrado corresponderá a su contenido en el borrado.
Use este comando:
svn log -v | awk ''/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };''
Esto mostrará todas las revisiones que alguna vez eliminaron cualquier archivo que coincida con el patrón. Es decir, si está buscando el archivo README, se encontrarán y enumerarán todos /src/README
, /src/README.first
y /some/deeply/hidden/directory/READMENOT
.
Si su nombre de archivo contiene barras diagonales (trazado), puntos u otros caracteres especiales de expresión regular, no se olvide de escapar de ellos para evitar desajustes o errores.
Yo quería una respuesta, yo mismo. Intente lo siguiente para generar solo eliminaciones de svn log
.
svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | /
awk ''{ if ($0 ~ /^r[0-9]+/) rev = $0 }
{ if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }''
Esto filtra la salida de registro a través de awk . awk almacena en búfer cada línea de revisión que encuentra, y la genera solo cuando se encuentra un registro de eliminación. Cada revisión solo se envía una vez, por lo que las eliminaciones múltiples en una revisión se agrupan juntas (como en la salida del svn log
estándar).
Puede especificar un --limit
para reducir la cantidad de registros devueltos. También puede eliminar el --stop-on-copy
, según sea necesario.
Sé que hay quejas sobre la eficacia de analizar todo el registro. Creo que esta es una solución mejor que grep y su opción "lanzar una red amplia" -B
. No sé si es más eficiente, pero no puedo pensar en una alternativa para svn log
. Es similar a la respuesta de @Alexander Amelkin, pero no necesita un nombre específico. También es mi primer script de awk , por lo que podría ser poco convencional.
svn log -v | grep -B50 YourDeletedFileName
Te conseguirá el camino y la revisión. En git (también comprueba los cambios de nombre):
git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName