tag - qué tipos de etiquetas existen en git
¿Cómo rastrear el contenido sin seguimiento? (10)
Vea debajo la línea continua para mi pregunta original.
Tengo una carpeta en mi directorio local sin seguimiento. Cuando ejecuto el git status
, obtengo:
Changed but not updated:
modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Cuando git add vendor/plugins/open_flash_chart_2
, intento nuevamente el git status
, aún dice sin seguimiento. ¿Que esta pasando?
Aquí hay un resumen simple de mi última media hora:
Descubrí que mi repositorio de Github no rastrea mi
vendor/plugins/open_flash_chart_2
. Específicamente, no hay contenido y muestra una flecha verde en el ícono de la carpeta.Intentó el
git submodule init
No submodule mapping found in .gitmodules for path ''vendor/plugins/open_flash_chart_2''
Submódulo de
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
probado,git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
vendor/plugins/open_flash_chart_2 already exists in the index
git status
modified: vendor/plugins/open_flash_chart_2 (untracked content)
.gitmodules
cualquier archivo llamado.gitmodules
en mi repositorio / directorio local pero no pude encontrar uno.
¿Qué debo hacer para que mis submódulos funcionen, por lo que git puede comenzar a rastrear correctamente?
Esto puede no estar relacionado (lo incluyo en caso de que ayude), pero cada vez que git commit -a
lugar de mi habitual git commit -m "my comments"
, arroja un error:
E325: ATTENTION
Found a swap file by the name ".git/.COMMIT-EDITMSG.swp"
dated: Thu Nov 11 19:45:05 2010
file name: c:/san/project/.git/COMMIT_EDITMSG
modified: YES
user name: San host name: San-PC
process ID: 4268
While opening file ".git/COMMIT_EDITMSG"
dated: Thu Nov 11 20:56:09 2010
NEWER than swap file!
Swap file ".git/.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git/.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Soy un novato completo en Github y, a pesar de tratar de revisar la documentación, estoy un poco perplejo por estos problemas en particular. Gracias.
- Eliminé los directorios .git de esos nuevos directorios (esto puede crear un submódulo dramático. Si lo desea, puede buscarlo en Google).
- Luego ejecuté git rm -rf --cached / the / new / directories
- Luego volví a agregar los directorios con un git add. desde arriba
URL de referencia https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U
Acabo de tener el mismo problema. La razón era porque había una subcarpeta que contenía una carpeta ".git". Quitarlo hizo feliz a Git.
Esta pregunta ya ha sido respondida, pero pensé que agregaría a la mezcla lo que descubrí cuando obtuve estos mensajes.
Tengo un repositorio llamado playground
que contiene varias aplicaciones de playground
aislado. Agregué dos nuevas aplicaciones de un tutorial al directorio del playground
clonando el repositorio del tutorial. El resultado fue que las cosas del git de las nuevas aplicaciones apuntaban al repositorio del tutorial y no a mi repositorio. La solución fue eliminar el directorio .git
de cada uno de esos directorios de aplicaciones, mv
los directorios de las aplicaciones fuera del directorio del área de playground
, y luego volverlos a ejecutar y ejecutar git add .
. Después de eso funcionó.
Ha agregado vendor/plugins/open_flash_chart_2
como entrada "gitlink", pero nunca lo ha definido como un submódulo. Efectivamente estás usando la característica interna que usa el submódulo de git (entradas de gitlink) pero no estás usando la característica del submódulo.
Probablemente hiciste algo como esto:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Este último comando es el problema. El vendor/plugins/open_flash_chart_2
directorios vendor/plugins/open_flash_chart_2
comienza como un repositorio independiente de Git. Usualmente tales sub-repositorios son ignorados, pero si le dices a git add que lo agregue explícitamente, entonces creará una entrada de gitlink que apunte a la confirmación HEAD del sub-repositorio en lugar de agregar los contenidos del directorio. Sería bueno si git add se negara a crear tales "semi-submódulos".
Los directorios normales se representan como objetos de árbol en Git; los objetos de árbol dan nombres y permisos a los objetos que contienen (generalmente otros objetos de árbol y blob-directorios y archivos, respectivamente). Los submódulos se representan como entradas "gitlink"; Las entradas de gitlink solo contienen el nombre del objeto (hash) del commit HEAD del submódulo. El "repositorio fuente" para la confirmación de un gitlink se especifica en el archivo .gitmodules
(y el archivo .git/config
una vez que el submódulo se ha inicializado).
Lo que tienes es una entrada que apunta a una confirmación en particular, sin registrar el repositorio fuente para esa confirmación. Puede solucionar esto haciendo que su gitlink se convierta en un submódulo adecuado o eliminando el gitlink y reemplazándolo con contenido "normal" (archivos y directorios).
Convertirlo en un submódulo adecuado
Lo único que falta para definir vendor/plugins/open_flash_chart_2
como un submódulo es un archivo .gitmodules
. Normalmente (si aún no lo había agregado como una entrada de gitlink simple), simplemente usaría git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Como descubriste, esto no funcionará si la ruta ya existe en el índice. La solución es eliminar temporalmente la entrada de gitlink del índice y luego agregar el submódulo:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Esto utilizará su sub-repositorio existente (es decir, no volverá a clonar el repositorio de origen) y .gitmodules
un archivo .gitmodules
que se .gitmodules
así:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
También hará una entrada similar en el .git/config
su repositorio principal (sin la configuración del path
).
Comprométalo y tendrás un submódulo apropiado. Cuando clones el repositorio (o presionas a GitHub y clonas desde allí), deberías poder reinicializar el submódulo a través de la git submodule update --init
.
Reemplácelo con contenido simple
El siguiente paso supone que su sub-repositorio en el vendor/plugins/open_flash_chart_2
no tiene ningún historial local que desee conservar (es decir, lo único que le importa es el árbol de trabajo actual del sub-repositorio, no el historial).
Si tiene un historial local en el sub-repositorio que le interese, entonces debe hacer una copia de seguridad del directorio .git
del sub-repositorio antes de eliminarlo en el segundo comando a continuación. (También considere el siguiente ejemplo de subárbol de git que conserva el historial de HEAD del sub repositorio).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Esta vez al agregar el directorio, no es un sub-repositorio, por lo que los archivos se agregarán normalmente. Desafortunadamente, desde que eliminamos el directorio .git
no hay una manera super fácil de mantener las cosas al día con el repositorio de origen.
Puede considerar usar una combinación de subárbol en su lugar. Hacerlo le permitirá obtener fácilmente cambios del repositorio de origen mientras mantiene los archivos "planos" en su repositorio (sin submódulos). El comando de subconjunto git de terceros es una buena envoltura alrededor de la funcionalidad de combinación de subárbol.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m''converting to subtree; please stand by''
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Luego:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 [email protected]:me/my_ofc2_fork.git changes_for_pull_request
El subárbol de git también tiene una opción --squash
que le permite evitar incorporar el historial del repositorio fuente a su historial, pero aún así le permite realizar cambios en la cadena ascendente.
Hace poco encontré este problema mientras trabajaba en un proyecto de contrato (considerado como clasificado). El sistema en el que tuve que ejecutar el código no tenía acceso a Internet, por razones de seguridad, por supuesto, y entonces la instalación de dependencias, usando compositor y npm, se estaba convirtiendo en un gran dolor.
Después de mucha deliberación con mi colega, decidimos simplemente migrar y copiar pegar nuestras dependencias en lugar de hacer la instalación del compositor o la instalación de npm.
Esto nos llevó a NO agregar proveedores y npm_modules en gitignore. Esto es cuando encontré este problema.
Changed but not updated:
modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Busqué en Google un poco y encontré este útil hilo en SO. No siendo muy profesional en Git, y estando un poco intoxicado mientras trabajaba en él, solo busqué todos los submódulos en la carpeta de proveedores.
find . -name ".git"
Esto me dio unas 4-5 dependencias que tenían git en ellos. Eliminé todas estas carpetas .git y voila, funcionó. Sé que es pirata, y no muy geek de todos modos. Oh dioses de SO, por favor, perdóname! La próxima vez prometo leer en gitlinks y obedecer a O poderoso Linus Tovalds.
Para señalar lo que tuve que sacar de la charla de Chris Johansen con OP (vinculada desde una respuesta a una respuesta):
git add vendor/plugins/open_flash_chart_2
# agregará gitlink, el contenido no se rastreará
git add vendor/plugins/open_flash_chart_2/
# ¡¡¡AVISO THE SLASH !!!!
El segundo formulario lo agregará sin gitlink, y los contenidos son rastreables. El directorio .git se ignora convenientemente y automáticamente. ¡Gracias, Chris!
Tuve el mismo problema con un gran proyecto con muchos submódulos. En base a las respuestas de share y VonC here , construyo un breve script bash que itera a través de todas las entradas de gitlink existentes y las agrega como submódulos apropiados.
#!/bin/bash
# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`
# Iterate through every submodule path
while read -r MOD; do
# extract submodule path (split line at whitespace and take string with index 3)
ARRIN=(${MOD})
MODPATH=${ARRIN[3]}
# grep module url from .git file in submodule path
MODURL=`grep "url = " $MODPATH/.git/config`
MODURL=${MODURL##*=}
# echo path and url for information
echo $MODPATH
echo $MODURL
# remove existing entry in submodule index
git rm --cached $MODPATH
# add new entry in submodule index
git submodule add $MODURL $MODPATH
done <<< "$MODULES"
Esto lo solucionó para mí, espero que sea de alguna ayuda.
Tuve el mismo problema, pero no fue resuelto en esta discusión.
También atiendo el problema del submódulo como se describe en la apertura del hilo.
% git status
# On branch master
# Changes not staged for commit:
# modified: bundle/taglist (untracked content)
Al mirar el diff reconocí un -dirty agregado a un hash: Leyendo los documentos otra vez, resolvió el problema para mí. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Consulte la sección "Errores con submódulos"
La razón fue que hubo cambios o contenido sin seguimiento dentro del submódulo. Primero tuve que acceder al directorio de submódulos, hacer un "git add" + "git commit" para obtener todo el contenido rastreado dentro del submódulo.
Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
# modified: bundle/taglist (new commits)
Ahora esta nueva CABEZA del submódulo podría estar comprometida con el módulo maestro.
Utilizo el truco sugerido por Peter Lada todo el tiempo, apodado como "submódulos falsos":
http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb
Es muy útil en varios escenarios (pe lo uso para mantener todas las configuraciones de Emacs en un repositorio, incluyendo el HEAD actual de todos los repositorios git dentro de los directorios del paquete elpa / el-get, para que pueda retroceder / avanzar fácilmente a un conocido versión de trabajo cuando alguna actualización rompe algo).
http://progit.org/book/ch6-6.html
Creo que deberías leer esto para aprender un poco sobre el submódulo. Está bien escrito, y no toma mucho tiempo leerlo.