Leí un montón de preguntas sobre herramientas simples de control de código fuente y Git parecía una opción razonable. Lo tengo en funcionamiento, y funciona bien hasta ahora. Un aspecto que me gusta de CVS es el incremento automático de un número de versión.
Entiendo que esto tiene menos sentido en un repositorio distribuido, pero como desarrollador, quiero / necesito algo como esto. Déjame explicarte por qué:
Yo uso Emacs. Periódicamente reviso y busco nuevas versiones de los archivos fuente de Lisp para paquetes de terceros. Digamos que tengo un archivo, foo.el, que, según el encabezado, es la versión 1.3; Si busco la última versión y veo que es 1.143 o 2.6 o lo que sea, sé que estoy bastante atrasado.
Si, en cambio, veo un par de hashes de 40 caracteres, no sabré cuál es más tarde ni tendré idea de cuánto más tarde será. Absolutamente lo odiaría si tuviera que verificar manualmente ChangeLogs solo para tener una idea de cuán desactualizado estoy.
Como desarrollador, quiero extender esta cortesía, tal como la veo, a las personas que usan mi salida (y tal vez me estoy engañando a mí mismo de que alguien lo es, pero dejemos eso de lado por un momento). No quiero tener que recordar incrementar el maldito número cada vez, o una marca de tiempo o algo así. Esa es una verdadera PITA, y lo sé por experiencia.
Entonces, ¿qué alternativas tengo? Si no puedo obtener un $ Id: $ equivalente, ¿de qué otra forma puedo proporcionar lo que estoy buscando?
Debo mencionar que mi expectativa es que el usuario final NO tendrá instalado Git e incluso si lo tiene, no tendrá un repositorio local (de hecho, espero que no esté disponible de esa manera).
fuente
filter-branch
algo o algo así.git describe
comando justo antes de compilar, guardar el resultado en un archivo de encabezado o incrustar el valor en su código.Por ahora hay soporte para $ Id: $ en Git. Para habilitarlo para el archivo README , debe colocar "README ident" en .gitattributes . Se admiten comodines en los nombres de archivo. Ver man gitattributes para más detalles.
fuente
$Id$
mencionado. Lo que se almacena es exactamente lo que obtienes. En cualquier caso, la versión pertenece a la colección completa de archivos que componen una confirmación, no a un archivo en particular (esa idea es un remanente de los días de RCS, o quizás SCCS tiene la culpa aquí ... Como CVS es solo un frontend glorificado a RCS, y SVN intenta ser un CVS-workalike, se atascó).Esta no es una solicitud irrazonable del OP.
Mi caso de uso es:
/usr/local/bin
cuando estén listos.Yo uso tres máquinas separadas con el mismo repositorio Git. Sería bueno saber en qué "versión" del archivo tengo actualmente
/usr/local/bin
sin tener que hacer un manual "diff -u <versión de repositorio> <versión en / usr / local / bin>".Para aquellos de ustedes que son negativos, recuerden que existen otros casos de uso. No todos usan Git para el trabajo colaborativo con los archivos en el repositorio de Git como su ubicación "final".
De todos modos, la forma en que lo hice fue crear un archivo de atributos en el repositorio como este:
Luego ponga $ Id $ en algún lugar del archivo (me gusta ponerlo después del shebang).
El compromiso Tenga en cuenta que esto no hace la expansión automáticamente como esperaba. Debe volver a copiar el archivo, por ejemplo,
Y luego verá la expansión, por ejemplo:
Hay buena información en ¿Cómo habilito la cadena de identificación para un repositorio de Git? .
fuente
git co
supone que debe hacer? Recibí el mensaje de error "git: 'co' is not a git command. See 'git --help'.
" ¿Debería serlogit checkout
?No estoy seguro de que esto vaya a estar en Git. Para citar a Linus :
Sin embargo, es bastante fácil verificar el registro: si está rastreando la rama estable de foo.el, puede ver qué nuevas confirmaciones hay en el registro de la rama estable que no están en su copia local. Si desea simular el número de versión interno de CVS, puede comparar la marca de tiempo de la última confirmación.
Editar: debe escribir o usar los scripts de otra persona para esto, por supuesto, no hacerlo manualmente.
fuente
$Id$
través delident
atributo, como se menciona en otra respuesta aquí, mostrando que incluso git en sí mismo no es rehén de la opinión de Linus.Como he escrito antes :
fuente
Yo tuve el mismo problema. Necesitaba tener una versión más simple que una cadena hash y disponible para las personas que usan la herramienta sin necesidad de conectarse al repositorio.
Lo hice con un gancho de confirmación previa de Git y cambié mi script para poder actualizarse automáticamente.
Baso la versión en la cantidad de confirmaciones realizadas. Esta es una condición de carrera leve porque dos personas podrían comprometerse al mismo tiempo y ambas piensan que están cometiendo el mismo número de versión, pero no tenemos muchos desarrolladores en este proyecto.
Como ejemplo, tengo un script que reviso que está en Ruby, y le agrego este código: es un código bastante simple, por lo que es fácil de portar a diferentes idiomas si está ingresando algo en un idioma diferente (aunque obviamente esto no funcionará fácilmente con registros no ejecutables, como archivos de texto). He añadido:
Y luego agrego una opción de línea de comandos (-updateVersion) al script, así que si lo llamo "tool -updateVersion", simplemente llama a updateVersion para la herramienta que modifica el valor "MYVERSION" en sí mismo y luego sale (podría que también actualice otros archivos si se abren y si lo desea).
Una vez que está configurado, voy al encabezado de Git y creo un script bash ejecutable de una línea
.git/hooks/pre-commit
.El script simplemente cambia al encabezado del directorio Git y llama a mi script con
-updateVersion
.Cada vez que reviso el script previo a la confirmación se ejecuta, que ejecuta mi script con -updateVersion, y luego la variable MYVERSION se actualiza en función de cuál será el número de confirmaciones. ¡Magia!
fuente
git updateVersion
? Ponga algunas muestras de cómo se llama.Si tener $ Palabras clave $ es esencial para usted, ¿tal vez podría intentar mirar Mercurial en su lugar? Tiene una extensión hgkeyword que implementa lo que quieres. Mercurial es interesante como DVCS de todos modos.
fuente
Algo que se hace con los repositorios de Git es usar el
tag
objeto. Esto se puede usar para etiquetar una confirmación con cualquier tipo de cadena y se puede usar para marcar versiones. Puede ver esas etiquetas en un repositorio con elgit tag
comando, que devuelve todas las etiquetas.Es fácil ver una etiqueta. Por ejemplo, si hay una etiqueta
v1.1
, puede verificar esa etiqueta en una rama como esta:Como se trata de un objeto de nivel superior, verá todo el historial de esa confirmación, así como podrá ejecutar diffs, realizar cambios y fusiones.
No solo eso, sino que una etiqueta persiste, incluso si la rama en la que estaba se ha eliminado sin volver a fusionarse con la línea principal.
fuente
export-subst
función degitattributes(5)
. Por supuesto, esto requiere el uso degit archive
para crear versiones, y solo en el archivo tar resultante se verán las ediciones de sustitución.Si entiendo correctamente, esencialmente, desea saber cuántas confirmaciones han ocurrido en un archivo dado desde la última actualización.
Primero obtenga los cambios en el origen remoto, pero no los combine en su
master
rama:Luego obtenga un registro de los cambios que ocurrieron en un archivo determinado entre su
master
sucursal y el control remotoorigin/master
.Esto le proporciona los mensajes de registro de todas las confirmaciones que han sucedido en el repositorio remoto desde la última vez que se fusionó
origin/master
con sumaster
.Si solo desea un recuento de los cambios, canalícelo a
wc
. Diga así:fuente
Si solo desea que las personas puedan tener una idea de cuán desactualizadas están, Git puede informarles de eso de varias maneras bastante fáciles. Comparan las fechas de la última confirmación en su tronco y su tronco, por ejemplo. Pueden usar
git cherry
para ver cuántas confirmaciones se han producido en su troncal que no están presentes en la suya.Si eso es todo lo que desea, buscaría una forma de proporcionarlo sin un número de versión.
Además, no me molestaría en extender la cortesía a nadie a menos que esté seguro de que lo quieren. :)
fuente
Para aplicar la expansión a todos los archivos en todos los subdirectorios en el repositorio, agregue un
.gitattributes
archivo al directorio de nivel superior en el repositorio (es decir, donde normalmente colocaría el.gitignore
archivo) que contiene:Para ver esto en efecto, primero deberá realizar un pago efectivo de los archivos, como eliminarlos o editarlos de cualquier manera. Luego restaurarlos con:
Y debería ver
$Id$
reemplazado por algo como:De
man gitattributes
:Este ID cambiará cada vez que se confirme una nueva versión del archivo.
fuente
Los ID de RCS son buenos para proyectos de un solo archivo, pero para cualquier otro, $ Id $ no dice nada sobre el proyecto (a menos que haga forzados registros ficticios a un archivo de versión ficticia).
Todavía uno podría estar interesado en cómo obtener los equivalentes de $ Author $, $ Date $, $ Revision $, $ RCSfile $, etc. en un nivel por archivo o en el nivel de confirmación (cómo colocarlos donde están algunas palabras clave es otra pregunta). No tengo una respuesta sobre estos, pero veo el requisito de actualizarlos, especialmente cuando los archivos (ahora en Git) se originaron en sistemas compatibles con RCS (CVS).
Tales palabras clave pueden ser interesantes si las fuentes se distribuyen por separado de cualquier repositorio de Git (eso es lo que yo también hago). Mi solución es así:
Cada proyecto tiene un directorio propio, y en la raíz del proyecto tengo un archivo de texto llamado
.version
cuyo contenido describe la versión actual (el nombre que se utilizará al exportar las fuentes).Mientras trabajaba para la próxima versión, un script extrae ese
.version
número, un descriptor de versión de Git (comogit describe
) y un número de compilación monótono.build
(más host y fecha) en un archivo fuente generado automáticamente que está vinculado al programa final, para que pueda encontrar fuera de qué fuente y cuándo fue construido.Desarrollo nuevas características en ramas separadas, y lo primero que hago es agregar
n
(para "siguiente") a la.version
cadena (varias ramas que se originan en la misma raíz usarían el mismo.version
número temporal ). Antes del lanzamiento, decido qué ramas fusionar (espero que todas tengan lo mismo.version
). Antes de comprometer la fusión, actualizo.version
al siguiente número (actualización mayor o menor, dependiendo de las características fusionadas).fuente
Si desea que el git commit información accesible en su código, entonces usted tiene que hacer una etapa de pre-construcción para llegar allí. En bash para C / C ++ podría verse así:
prebuild.sh
con
version.h
aspecto de:Luego, donde lo necesite en su código
#include "version.h"
y referenciagit_tag
ogit_commit
según sea necesario.Y tu
Makefile
podría tener algo como esto:Esto tiene el beneficio de:
Esta implementación de
prepublish.sh
tiene los inconvenientes de:git_tag
/git_commit
no cambió.git describe --tags --always --dirty
para atrapar ese caso de uso.Un aficionado
prebuild.sh
que podría evitar estos problemas se deja como ejercicio para el lector.fuente
Estoy de acuerdo con aquellos que piensan que el reemplazo de tokens pertenece a herramientas de compilación en lugar de herramientas de control de versiones.
Debería tener alguna herramienta de lanzamiento automatizada para configurar los ID de versión en sus fuentes al momento de etiquetar el lanzamiento.
fuente
Los nombres de etiquetas y otra información relacionada ahora se pueden editar directamente en archivos automáticamente por Git a través de la
export-subst
función degitattributes(5)
. Por supuesto, esto requiere el uso degit archive
para crear versiones, y solo en el archivo tar resultante se verán las ediciones de sustitución.Por ejemplo en el
.gitattributes
archivo pon la siguiente línea:Luego, en los archivos de origen, puede agregar una línea como esta:
Y se expandirá para verse así en una versión creada, por ejemplo, por
git archive v1.2.0.90
:fuente
Como usa Emacs, puede que tenga suerte :)
Me encontré con esta pregunta por coincidencia, y también por coincidencia, encontré Lively hace unos días, un paquete de Emacs que permite tener piezas vivas de Emacs Lisp en su documento. No lo he intentado para ser honesto, pero me vino a la mente al leer esto.
fuente
También vine de SCCS, RCS y CVS (
%W% %G% %U%
).Tuve un desafío similar. Quería saber qué versión tenía un código en cualquier sistema que lo ejecutara. El sistema puede o no estar conectado a ninguna red. El sistema puede o no tener instalado Git. El sistema puede o no tener el repositorio de GitHub instalado en él.
Quería la misma solución para varios tipos de código (.sh, .go, .yml, .xml, etc.). Quería que cualquier persona sin conocimiento de Git o GitHub pudiera responder la pregunta "¿Qué versión está ejecutando?"
Entonces, escribí lo que llamo un contenedor alrededor de algunos comandos Git. Lo uso para marcar un archivo con un número de versión y alguna información. Resuelve mi desafío. Te puede ayudar.
https://github.com/BradleyA/markit
fuente
Para resolver este problema por mí mismo, creé un pequeño "hack" como enlace posterior a la confirmación:
En más detalle documentado en esta publicación en mi blog .
fuente