Git tiene un árbol vacío bien conocido, o al menos un poco conocido, cuyo SHA1 es:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(puede ver esto en cualquier repositorio, incluso uno recién creado, con git cat-file -t
y git cat-file -p
).
Si trabaja duro y tiene mucho cuidado, puede usar este árbol vacío para almacenar un directorio que no tiene archivos (consulte la respuesta a Cómo agregar un directorio vacío a un repositorio git ), aunque en realidad no es una gran idea.
Es más útil como un argumento para git diff-tree
, cuál de los ganchos de muestra lo hace.
Lo que me pregunto es
- ¿Qué tan confiable es esto, es decir, alguna versión futura de git no tendrá un objeto git numerado
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - ¿Por qué no hay un nombre simbólico para el árbol vacío (o hay uno?).
(Una manera rápida y sucia de crear un nombre simbólico es poner el SHA1, por ejemplo,. .git/Nulltree
Desafortunadamente, tiene que hacer esto para cada repositorio. Parece mejor simplemente poner el número mágico en los guiones, etc. Simplemente tengo una aversión general a números mágicos)
git hash-object -t tree /dev/null
método (de la respuesta de VonC a continuación) tiene la ventaja de no codificar SHA-1, en caso de que alguna versión futura de git cambie a SHA-2, por ejemplo. (No voy a intentar predecir cuándo podría suceder eso :-) Sería más fácil cambiar Mercurial a SHA-2, ya que dejaron espacio para ello.)Respuestas:
Este hilo menciona:
O, como Ciro Santilli propone en los comentarios :
O, como se ve aquí , de Colin Schimmelfing :
Así que supongo que es más seguro definir una variable con el resultado de ese comando como su árbol sha1 vacío (en lugar de confiar en un "valor bien conocido").
Nota: Git 2.25.1 (febrero de 2020) propone en commit 9c8a294 :
Y agrega:
Tenga en cuenta que verá que SHA1 aparece en algún repositorio de GitHub cuando el autor quiere que su primer commit esté vacío (vea la publicación del blog " Cómo inicializo mis repositorios de Git "):
Te regalaré:
(¿Ves el árbol SHA1?)
Incluso puede modificar su historial existente sobre esa confirmación vacía (consulte " git: ¿cómo insertar una confirmación como la primera, cambiando todas las demás? ")
En ambos casos, no confía en el valor SHA1 exacto de ese árbol vacío.
Simplemente siga una práctica recomendada, inicializando su repositorio con una primera confirmación vacía .
Para hacer eso:
Eso generará un commit con un SHA1 específico para su repositorio, nombre de usuario, correo electrónico, fecha de creación (lo que significa que el SHA1 del commit en sí será diferente cada vez).
Pero el árbol al que hace referencia esa confirmación será
4b825dc642cb6eb9a060e54bf8d69288fbee4904
el árbol vacío SHA1.Para mostrar solo el árbol de una confirmación (mostrar el árbol de confirmación SHA1):
Si esa confirmación, haciendo referencia a un árbol vacío, es su primera confirmación, puede mostrar ese árbol vacío SHA1 con:
(y eso incluso funciona en Windows, con comandos Gnu en Windows )
Como se comenta a continuación , usando
git diff <commit> HEAD
, esto mostrará todo su archivo en la rama HEAD actual:Nota: ese valor de árbol vacío se define formalmente en
cache.h
.Desde Git 2.16 (Q1 2018), se usa en una estructura que ya no está vinculada a (solo) SHA1, como se ve en commit eb0ccfd :
Vea más en " ¿Por qué Git no usa SHA más moderno? ": Es SHA-2 , ya que Git 2.19 (Q3 2018)
Con Git 2.25 (Q1 2020), las pruebas se están preparando para una transición SHA-2 y están involucrando el árbol vacío.
Ver cometer fa26d5e , comprometerse cf02be8 , comprometerse 38ee26b , comprometerse 37ab8eb , comprometerse 0370b35 , comprometerse 0253e12 , comprometerse 45e2ef2 , comprometerse 79b0edc , comprometerse 840624f , comprometerse 32a6707 , comprometerse 440bf91 , comprometerse 0b408ca , comprometerse 2eabd38 (28 de octubre 2019), y comprometerse 1bcef51 , cometen ecde49b (05 oct 2019) por brian m. Carlson (
bk2204
) .(Fusionada por Junio C Hamano -
gitster
- en commit 28014c110 nov 2019)Entonces
t/oid-info/hash-info
ahora incluye:El SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" es el nuevo4b825dc642cb6eb9a060e54bf8d69288fbee4904
árbol vacío SHA1 " ".fuente
git diff-tree
en algunos scripts que estoy escribiendo. No hay garantía de que haya una confirmación inicial vacía en el repositorio. Así que me pregunto si estos scripts podrían terminar rompiéndose algún día.-w
agit hash-object
, creará el objeto en el repositorio contra el que se ejecuta, y eso recrearía el árbol vacío en el repositorio contra el que se está ejecutando si alguna vez desapareciera en el futuro./dev/null
:printf '' | git hash-object --stdin -t tree
:)Escribí una publicación de blog con dos formas diferentes de encontrar el hash: http://colinschimmelfing.com/blog/gits-empty-tree/
Si alguna vez cambiara por alguna razón, podría usar las dos formas siguientes para encontrarlo. Sin embargo, me sentiría bastante seguro usando el hash en los alias .bashrc, etc., y no creo que cambie pronto. Por lo menos, probablemente sería una gran versión de git.
Las dos formas son:
git hash-object -t tree --stdin < /dev/null
git write-tree
en ese nuevo repositorio: el hash será generado por git write-tree.fuente
–-stdin
me dafatal: Cannot open '–-stdin': No such file or directory
con git 2.7.2. Sin embargo, ejecutarlo sin--stdin
como en la respuesta de VonC da el valor hashAquí está la respuesta sobre cómo crear una confirmación de árbol vacía, incluso en el caso de que el repositorio aún no esté vacío. https://stackoverflow.com/a/14623458/9361507
Pero prefiero "vacío" para ser etiqueta, pero no una rama. La forma simple es:
Porque la etiqueta puede apuntar a tree-ish directamente, sin confirmación. Ahora para obtener todos los archivos en el árbol de trabajo:
O lo mismo con stat:
Todos los archivos como diff:
Verifique los espacios en blanco en todos los archivos:
fuente
git rev-parse
tendría nuevas banderas o palabras clave o algo por el estilo, para producir (a) el hash de árbol vacío y (b) el hash de confirmación nula. Ambos serían útiles en scripts y protegerían contra los cambios propuestos SHA-256.