tag - qué tipos de etiquetas existen en git
¿Por qué no hay una opción de confirmación específica de Git Clone? (4)
Como dicen las otras respuestas, esto no suele ser un problema, pero no dicen por qué no se puede clonar un compromiso específico. La respuesta es la seguridad.
Si accidentalmente ingresa información confidencial, y luego fuerza un historial fijo, las confirmaciones con la información confidencial aún se almacenarán en el servidor, hasta que el recolector de basura de Git del servidor descubra que ya no es necesario. Si se conoce el hash (podría estar disponible, por ejemplo, en los registros), un usuario malintencionado podría solicitar el compromiso específico que no debería haberse enviado, incluso si pudo verificar que cuando forzó el historial fijo, nadie Habia recuperado esos compromisos aun.
Asegurarse de que solo pueda clonar desde refs se asegura de que solo se enviarán confirmaciones "accesibles" a los clientes.
A la luz de una pregunta reciente sobre SO , me pregunto por qué no hay una opción en git clone
tal que el puntero HEAD
de la rama recién creada apunte a una confirmación específica. En la pregunta anterior, OP está tratando de proporcionar instrucciones sobre el compromiso específico que sus usuarios deberían clonar.
Tenga en cuenta que esta pregunta no es sobre cómo clonar una versión en particular mediante el reset
; pero sobre por qué no hay ?
Dos respuestas hasta ahora (en el momento en que escribí esto, ahora hay más) son correctas en lo que dicen, pero en realidad no responden la pregunta del "por qué". Por supuesto, la pregunta del "por qué" es realmente difícil de responder, excepto por los autores de las distintas partes de Git (e incluso entonces, ¿qué pasaría si dos colaboradores frecuentes de Git dieran dos respuestas diferentes?).
Aún así, considerando la "filosofía" de Git como si fuera, en general, los distintos protocolos de transferencia funcionan al nombrar una referencia . Si proporcionan un SHA-1, es el SHA-1 de esa referencia . Para alguien que aún no tiene acceso directo (por ejemplo, a la línea de comandos) al repositorio, ninguno de los comandos integrados permite referirse a las confirmaciones por ID. Lo más cercano que puedo encontrar a una razón para esto, y en realidad es una buena razón 2, es este bit en la documentación de git upload-archive
:
SEGURIDAD
Para proteger la privacidad de los objetos que se han eliminado de la historia pero que aún no se han eliminado, git-upload-archive evita el servicio de archivos para confirmaciones y árboles que no son accesibles desde las referencias del repositorio. Sin embargo, dado que calcular la accesibilidad del objeto es computacionalmente costoso, git-upload-archive implementa un conjunto de reglas más estricto pero más fácil de verificar ...
Sin embargo, continúa diciendo:
Si la opción de configuración
uploadArchive.allowUnreachable
es verdadera, estas reglas se ignoran y los clientes pueden usar expresiones sha1 arbitrarias. Esto es útil si no le importa la privacidad de los objetos inalcanzables, o si su base de datos de objetos ya está disponible públicamente para acceder a través de http no inteligente.
lo que es particularmente interesante ya que git clone
obtiene todos los objetos accesibles en primer lugar, después de lo cual su clon local podría comprobar de manera trivial una confirmación por ID de SHA-1 (y crear un nombre de rama local que apunte a esa ID si lo desea, o simplemente dejar su clonar en modo "cabeza separada").
Dadas estas dos corrientes cruzadas, creo que la respuesta real al "por qué", en este punto, es "a nadie le importa lo suficiente como para agregarlo". :-) El argumento de privacidad es válido, pero no hay ninguna razón por la que git clone
no haya podido verificar un commit por ID después de la clonación, tal como se le puede indicar que revise alguna otra rama que no sea master
3 con git clone -b ...
... El único inconveniente de permitir que -b sha1
sea que Git no puede verificar por adelantado (antes de que comience el proceso de clonación) si se recibirá sha1
. Puede verificar los nombres de referencia, ya que estos se transfieren (junto con sus consejos de ramificación u otros valores SHA-1) por adelantado, por lo que git clone -b nonexistentbranch ssh://...
termina rápidamente y no crea la copia:
fatal: Remote branch nonexistentbranch not found in upstream origin
fatal: The remote end hung up unexpectedly
Si -b
permitiera una identificación, obtendrías el clon completo, entonces tendrías que decirte: "Oh, Dios mío, lo siento, no puedo verificar esa identificación, te dejaré como maestro" o lo que sea. (Que es más o menos lo que sucede ahora con un submódulo roto).
1 Aunque git upload-archive
ahora aplica esta regla de "privacidad", no siempre fue así (se introdujo en la versión 1.7.8.1); y muchos (¿la mayoría?) los servidores git-web, incluido el que se distribuye con Git en sí, permiten la visualización mediante una identificación arbitraria. Probablemente esta sea la razón allowUnreachable
se agregó allowUnreachable
para upload-archive
unos años después de que se agregó el código "solo por nombre de referencia" (pero tenga en cuenta que las versiones de Git posteriores a 1.7.8 y anteriores a 2.0.0 no tienen forma de aflojar las reglas). Por lo tanto, mientras que la idea de "seguridad" es válida, hubo un período (anterior a 1.7.8.1) cuando no se aplicó.
2 Existen numerosas formas de "filtrar" datos aparentemente privados de un repositorio Git. Un nuevo archivo, Documentation/transfer-data-leaks , está a punto de aparecer en Git 2.11.1, mientras que Git 2.11.0 agregó algunas características internas (vea commit 722ff7f87 entre otras) para eliminar inmediatamente los objetos enviados pero no aceptados. Dichos objetos eventualmente se recolectan en la basura, pero eso los deja expuestos por el tiempo.
3 En realidad, por defecto, git clone
hace un check-out local de la rama que cree que va con la referencia HEAD
del control remoto. Sin embargo, por lo general ese es el master
.
La clonación de un repositorio es una operación diferente a la de pago. Usted no "clona un compromiso específico". Por conveniencia, puede clonar y luego retirar una rama particular preexistente al mismo tiempo, ya que eso es lo que la mayoría de la gente quiere. Si eso no satisface sus necesidades (no hay una rama para el SHA en particular que desea) solo use o alias alguna forma de
git clone -n <some repo> && cd <some repo> && git checkout SHA
Si una sucursal hace referencia a su compromiso específico, puede hacer lo siguiente:
git clone -b yourBranch /url/of/the/repo
El repositorio clonado estará directamente en la confirmación a la que hace referencia esa rama.