OP quería recuperar todas las versiones de, pero las respuestas no respondían. Especialmente si el archivo tiene cientos de revisiones (todas las sugerencias son demasiado manuales).La única solución a medias fue propuesta por @Tobias en los comentarios, pero sugirió que bash loop generaría los archivos en orden aleatorio y generaría cientos de archivos vacíos cuando se utilizaran contra nuestros repositorios. Una de las razones fue que "rev-list --all --objects" mostraría diferentes objetos (árboles incluidos) pero inútiles para nuestro propósito.
Comencé con la solución de Tobias, agregué contadores, limpié un poco y terminé reinventando la rueda en forma del script bash que se muestra a continuación.
La secuencia de comandos sería:
- extraer todos versiones de archivos a/tmp/all_versions_exported
- tome 1 argumento - ruta relativa al archivo dentro repositorio git
- dar resultado nombres de archivo prefijo numérico (ordenable)
- mención inspeccionado nombre de archivo en archivos de resultados (para contar las manzanas, aparte de las naranjas :)
- Aviso fecha de comprometerse en el nombre del archivo resultado (véase el ejemplo de salida por debajo)
- no crear archivos de resultados vacíos
cat///bin/git_export_all_file_versions locales usr
#!/bin/bash
# we'll write all git versions of the file to this folder:
EXPORT_TO=/tmp/all_versions_exported
# take relative path to the file to inspect
GIT_PATH_TO_FILE=$1
# ---------------- don't edit below this line --------------
USAGE="Please cd to the root of your git proj and specify path to file you with to inspect (example: $0 some/path/to/file)"
# check if got argument
if [ "${GIT_PATH_TO_FILE}" == "" ]; then
echo "error: no arguments given. ${USAGE}" >&2
exit 1
fi
# check if file exist
if [ ! -f ${GIT_PATH_TO_FILE} ]; then
echo "error: File '${GIT_PATH_TO_FILE}' does not exist. ${USAGE}" >&2
exit 1
fi
# extract just a filename from given relative path (will be used in result file names)
GIT_SHORT_FILENAME=$(basename $GIT_PATH_TO_FILE)
# create folder to store all revisions of the file
if [ ! -d ${EXPORT_TO} ]; then
echo "creating folder: ${EXPORT_TO}"
mkdir ${EXPORT_TO}
fi
## uncomment next line to clear export folder each time you run script
#rm ${EXPORT_TO}/*
# reset coutner
COUNT=0
# iterate all revisions
git rev-list --all --objects -- ${GIT_PATH_TO_FILE} | \
cut -d ' ' -f1 | \
while read h; do \
COUNT=$((COUNT + 1)); \
COUNT_PRETTY=$(printf "%04d" $COUNT); \
COMMIT_DATE=`git show $h | head -3 | grep 'Date:' | awk '{print $4"-"$3"-"$6}'`; \
if [ "${COMMIT_DATE}" != "" ]; then \
git cat-file -p ${h}:${GIT_PATH_TO_FILE} > ${EXPORT_TO}/${COUNT_PRETTY}.${COMMIT_DATE}.${h}.${GIT_SHORT_FILENAME};\
fi;\
done
# return success code
echo "result stored to ${EXPORT_TO}"
exit 0
Ejemplo de uso:
cd /home/myname/my-git-repo
git_export_all_file_versions docs/howto/readme.txt
result stored to /tmp/all_versions_exported
ls /tmp/all_versions_exported
0001.17-Oct-2016.ee0a1880ab815fd8f67bc4299780fc0b34f27b30.readme.txt
0002.3-Oct-2016.d305158b94bedabb758ff1bb5e1ad74ed7ccd2c3.readme.txt
0003.29-Sep-2016.7414a3de62529bfdd3cb1dd20ebc1a977793102f.readme.txt
0004.28-Sep-2016.604cc0a34ec689606f7d3b2b5bbced1eece7483d.readme.txt
0005.28-Sep-2016.198043c219c81d776c6d8a20e4f36bd6d8a57825.readme.txt
0006.9-Sep-2016.5aea5191d4b86aec416b031cb84c2b78603a8b0f.readme.txt
<and so on and on . . .>
de edición: Si ve errores como este:
fatal: No es un nombre de objeto válido 3e93eba38b31b8b81905ceaa95eb47bba ed46494: readme.txt
significa que ha iniciado el script no desde la carpeta raíz de su proyecto git.
La respuesta aceptada previamente (@sehe) no realizó directamente la recuperación de TODAS las versiones a la vez. Como mencioné en el comentario, utilicé los dos comandos para construir un programa java (no una solución general que pudiera cargarse como está) que lo hizo. Su solución es mejor, ya que da el resultado final de mi pasado programa de Java. – max152
Este script funciona, pero hay algunos problemas y comportamientos posiblemente inesperados. Consulte [mi respuesta] (http://stackoverflow.com/a/43747334/1132502) para obtener detalles y un script actualizado. –
@Nathan, increíble! me alegro de que lo haya encontrado útil +1 –