tag remote remota rama example cambiar git workflow git-clone

git - remote - ¿Por qué no puedo empujar desde un clon superficial?



git push tag (2)

La opción git clone --depth command dice

--depth <depth> Create a shallow clone with a history truncated to the specified number of revisions. A shallow repository has a number of limitations (you cannot clone or fetch from it, nor push from nor into it), but is adequate if you are only interested in the recent history of a large project with a long history, and would want to send in fixes as patches.

¿Por qué los clones superficiales tienen esta limitación? ¿Por qué es un flujo de trabajo solo de parches?

Para algunos flujos de trabajo de proyectos, necesito pasar solo el último compromiso de una sola rama a un codificador, y luego hacer que puedan push su desarrollo (hacia adelante) hacia el servidor principal. Esto en parte para la seguridad, la protección de la propiedad intelectual y el tamaño del repositorio, y en parte para reducir la confusión que un repositorio grande podría traer a un codificador ingenuo. ¿Hay un flujo de trabajo git que lo permita?

Actualización: Basado en la respuesta de Karl Bielefeldt, la git checkout --orphan debería ser la respuesta correcta. Pero todavía se necesita ''clonar'' esa rama solo para el nuevo usuario, y ser capaz de impulsarlo de manera efectiva.

La página del manual dice:

git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>] --orphan

Cree una nueva sucursal huérfana, denominada <new_branch> , iniciada desde <start_point> y cambie a ella. El primer compromiso realizado en esta nueva rama no tendrá padres y será la raíz de una nueva historia totalmente desconectada de todas las otras ramas y compromisos.

El índice y el árbol de trabajo se ajustan como si previamente hubiera ejecutado git checkout <start_point> . Esto le permite comenzar un nuevo historial que registra un conjunto de rutas similares a <start_point> ejecutando git commit -a para realizar la confirmación de raíz.

Esto puede ser útil cuando desee publicar el árbol desde una confirmación sin exponer su historial completo. Es posible que desee hacer esto para publicar una rama de código abierto de un proyecto cuyo árbol actual es "limpio", pero cuyo historial completo contiene bits de código privados o gravados de otra manera.

Si desea iniciar un historial desconectado que registra un conjunto de rutas que es totalmente diferente de la de <start_point> , entonces debe borrar el índice y el árbol de trabajo inmediatamente después de crear la rama huérfana ejecutando git rm -rf . desde el nivel superior del árbol de trabajo. Después, estará listo para preparar sus nuevos archivos, repoblar el árbol de trabajo, copiarlos de otro lugar, extraer un tarball, etc.

El enlace de VonC a los comentarios de Junio ​​es interesante. Creo que el manual debería proporcionar la guía en este caso, y permitir el comando correcto [por ejemplo, clone <branch> --options ] para extraer solo la parte relevante del repositorio. Obviamente, la probabilidad de éxito de push se incrementa al tener unos commits y SHA1 enlazados al final del historial que bloquearán la coincidencia de repo.

Actualizar Git 1.9.0: notas de la versión 14 Feb ''14.

"Solía ​​prohibirse la extracción de un repositorio clonado poco a poco, principalmente porque los recorridos de codificación involucrados no fueron cuidadosamente investigados y no nos molestamos en apoyar dicho uso. Este lanzamiento intenta permitir la transferencia de objetos desde un repositorio clonado superficialmente de una manera más controlada (es decir, el receptor se convierte en un repositorio poco profundo con un historial truncado) ".

Esta es una buena noticia para los clonadores superficiales. Siguiente - Clones estrechos posiblemente.


¿Hay un flujo de trabajo git que lo permita?

Sí, es para enviar correcciones como parches. git format-patch está especialmente diseñado para permitir esto. Se llama flujo de trabajo "guardián", si desea buscar más detalles en google. Es difícil creer que una organización esté preocupada con la "seguridad y protección de IP" ya que la suya ya no está usando algo similar, donde una persona o un grupo pequeño es responsable de verificar los cambios "no confiables" antes de que entren en la construcción real.

En base a su comentario, ahora tengo una mejor idea de sus requisitos. Lo que recomendaría es crear una sucursal huérfana (ver git checkout --orphan ), desde cualquier punto que desee que comiencen sus desarrolladores. Clone solo esa rama en un repositorio diferente accesible para esos desarrolladores, y permita que se clonen, empujen y extraigan normalmente de ese repositorio.

Luego, cuando necesites reintegrar sus cambios en el repositorio oficial protegido, simplemente retira su rama, haz una copia con la git branch para que no sobrescribas a tu huérfano original (en caso de que quieras repetir el proceso más adelante), luego rebase la copia en su punto de bifurcación original, y fusión o lo que sea normal. La historia parecerá que funcionó directamente desde su repositorio protegido.

Es un poco más complicado de lo normal, pero ese es el precio pagado por el aislamiento adicional.


Como dice Junio ​​C. Hamano (mantenedor principal de Git):

No es la regla más o menos como:

Si el historial de su repositorio poco profundo no se extiende lo suficiente y el otro repositorio se bifurca antes de su historial truncado, no podrá calcular el antecesor común y no podrá expulsarlo.

Actualización 2014: ver " ¿Es más útil de lo que se imagina git clone --depth 1 (clon superficial)? ": ¡ Esa limitación se eliminará con Git 1.9!

Actualización 2015: con Git 2.5+, incluso podrá obtener una única confirmación . Consulte " Extraer un compromiso específico de un repositorio de git remoto "

Respuesta original (agosto de 2011):

En realidad, ahora que lo pienso, es mucho más fuerte que "no se puede calcular lo común".

La historia puede verse así:

R---R---R / --R---R---X---X---S---S---S

donde S son los commits que tienes en tu repositorio poco profundo, y R son los commits que existen en el repositorio que recibe tu push.
Debido a que su historial es poco profundo, ninguno de los repositorios tiene '' X '' que son las confirmaciones que deben existir para mantener completo el historial del depósito del destinatario; para empezar, el destinatario no es poco profundo, y no queremos que sea poco profundo.

Si clonó superficialmente hace algún tiempo, trabajó sin comunicarse con el otro lado mientras el otro lado progresaba, Y si el progreso del otro lado incluía un rebobinado y reconstrucción del historial, vería una topología similar.
La '' S '' más a la izquierda en la imagen de arriba podría haber sido la punta de la rama cuando se clonó superficialmente con profundidad 1, y desde entonces el extremo remoto puede haber descartado las tres confianzas más altas y ha reconstruido su historial que lleva a la '' R '' más a la derecha .
En tal caso, presionar a la HEAD del control remoto fallará.

Por lo tanto, podría funcionar en algún caso, pero no es compatible:

Si tengo que decir algo sobre esto ...

  • Creo que "no es compatible" es una forma concisa de brindar información suficientemente buena, pero solo funcionaría para personas inteligentes.

  • No todos son inteligentes; algunos lo prueban ellos mismos, ven que la operación parece funcionar para su número limitado de ensayos, y concluirían que funcionaría la mayor parte del tiempo.
    Y felicitan a su propia inteligencia por decir "la mayoría de las veces", no "siempre".
    Y se molestan cuando ven que no funciona, a pesar de que han sido advertidos.

Para obtener más información sobre el proceso de actualización de clonación superficial, consulte " ¿Cómo actualizar un clon superficial de git? ".