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


¿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.


32
2017-07-07 20:43


origen


Respuestas:


Comenzando con Git 2.5.0 (que debe estar disponible en ambos el lado del cliente y del servidor) puede configurar 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.


18
2018-03-31 08:36



La respuesta inmediata es: No puedes.
¿Por qué? 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>

5
2017-07-07 21:08



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 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.


2
2017-09-12 04:41



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 usar commit hash, respuesta corta es  NO.

Utilizo esta construcción de comando (probado en v2.13.2.windows.1) para etiquetas:

git clone --depth 1 git@github.com: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 git@github.com: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 del directorio (267K vs 2.6M usando full 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 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 publicitado"?

También, no hay trucos como:

git fetch --depth 1 origin <COMMIT_HASH>

Gracias @BenjiWiebe por señalarme mi error.


2
2018-02-12 14:19