remote from git shallow-clone

from - git clone ubuntu



¿Cómo clonar superficialmente un compromiso específico con profundidad 1? (4)

¿Es posible clonar superficialmente un compromiso específico en un repositorio, es decir, con profundidad 1? Algo como

git clone http://myrepo.git 728a4d --depth 1

para obtener el estado del repositorio tal como está en la confirmación con SHA 728a4d... ?

La motivación es evitar tener que clonar todo el repositorio, luego verificar esa confirmación específica, cuando solo estamos interesados ​​en el estado del repositorio en ese compromiso específico.


Comenzando con Git 2.5.0 (que debe estar disponible tanto en el lado del cliente como del servidor) puede establecer uploadpack.allowReachableSHA1InWant=true en el lado del servidor para habilitar la recuperación de SHA1 específicos:

git init git remote add origin <url> git fetch --depth 1 origin <sha1> git checkout FETCH_HEAD

Tenga en cuenta que no encontré una sintaxis para hacer esto con git clone directamente.


Intenta usar while estás en bash:

git clone --depth=1 $url i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

Esto es bastante lento porque recupera cada compromiso individualmente; puede aumentar el incremento (para obtener compromisos en lotes y mejorar el rendimiento en una red), pero sigue siendo un enfoque de fuerza bruta.


La respuesta inmediata es: No puedes.
¿Por qué? la explicación detallada se puede encontrar aquí: ¿Por qué no hay una opción de compromiso específico de Git Clone?

¿Qué más puedes hacer?

¿Cómo clonar el repositorio a una confirmación específica? (clon completo)

# Create empty repository to store your content git clone <url> git reset <sha-1> --hard

Más información:

Cómo clonar una sola rama?

git clone <url> --branch <branch_name> --single-branch <folder_name>

¿Cómo clonar solo la última confirmación de una rama determinada?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

¿Cómo clonar superficialmente un compromiso específico con profundidad 1?

Como @sschuberth comentó: --depth implica --single-branch .

En lugar de clonar, usa el comando fetch:

# fetch a commit (or branch or tag) of interest # In this case you will have the full history of this commit git fetch origin <sha1>


NOTA: Mi ejemplo no ayuda a clonar mediante un hash de confirmación, pero ayudará a clonar una etiqueta y tener un repositorio ligero.

Si tiene que tener solo una confirmación en su "clon" y va a utilizar el hash de confirmación, la respuesta breve es NO .

Utilizo esta construcción de comandos (probada en v2.13.2.windows.1 ) para las etiquetas:

git clone --depth 1 [email protected]:VENDOR/REPO.git --branch 1.23.0 --single-branch

1.23.0 - puede ser un hash de confirmación o una rama.

Ejemplo completo:

$ git clone --depth 1 [email protected]:Seldaek/monolog.git --branch 1.23.0 --single-branch Cloning into ''monolog''... remote: Counting objects: 201, done. remote: Compressing objects: 100% (188/188), done. remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0 Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done. Resolving deltas: 100% (42/42), done. Note: checking out ''fd8c787753b3a2ad11bc60c063cff1358a32a3b4''. You are in ''detached HEAD'' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> $ cd monolog

.git dir tamaño ( 267K vs 2.6M usando clone completo):

$ du -h --max-depth=0 .git 267K .git

Me gustaría denotar, --branch puede tomar una etiqueta / rama.

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branch también puede tomar etiquetas y separa el HEAD en ese commit en el repositorio resultante.

UPD

En pocas palabras, puede tomar "refs". Puede leer más aquí: ¿Qué significa el mensaje de error de git "El servidor no permite la solicitud de un objeto no anunciado"?

Además, no hay trucos como:

git fetch --depth 1 origin <COMMIT_HASH>

Gracias @BenjiWiebe por señalarme mi error.