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


¿Es posible clonar de forma superficial una confirmación específica en un repositorio, es decir, con profundidad 1? Algo así 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 revisar ese commit específico, cuando solo estamos interesados en el estado del repositorio en ese commit específico.

Author: Chin, 2015-07-07

4 answers

Comenzando con Git 2.5.0 (que debe estar disponible en tanto en el lado cliente como en el lado servidor) puede configurar uploadpack.allowReachableSHA1InWant=true en el lado servidor para habilitar la obtención de SHA1s 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.

 23
Author: sschuberth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-31 08:36:32

La respuesta inmediata es: No puedes.
¿Por qué? se puede encontrar una explicación detallada aquí: ¿Por Qué No Hay Una Opción De Confirmación Específica De Git Clone?

¿Qué más puedes hacer?

¿Cómo clonar un 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 dada?

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

Cómo clonar poco profundo un commit específico con profundidad 1?

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

En lugar de clonar use 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>
 4
Author: CodeWizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:02

Intenta usar while 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 obtiene cada commit individualmente; podría aumentar el incremento (para obtener commits en lotes y mejorar el rendimiento en una red), pero sigue siendo un enfoque de fuerza bruta.

 2
Author: Corin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-20 23:52:36

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 solo tienes que tener una confirmación en tu "clon" y vas a usar el hash de confirmación, la respuesta corta es NO.

Uso esta construcción de comandos (probado en v2.13.2.Windows.1) para 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 tamaño dir ( 267K vs 2.6 M usando completo clone):

$ 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 separar la CABEZA en esa confirmación en el repositorio resultante.

UPD

En pocas palabras, puede tomar "refs". Puede leer más aquí: Qué hace el mensaje de error de git " Server does not allow solicitud de objeto no anunciado " mean?

Además, no hay trucos como:

git fetch --depth 1 origin <COMMIT_HASH>

Gracias @BenjiWiebe por señalarme mi error.

 2
Author: Kirby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 13:33:52