¿Cómo rastrear contenido no rastreado?

159

Vea debajo de la línea continua para mi pregunta original.

Tengo una carpeta en mi directorio local que no tiene seguimiento. Cuando corro git status, obtengo:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Cuando escribo y git add vendor/plugins/open_flash_chart_2luego intento de git statusnuevo, todavía 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_2complemento. Específicamente, no hay contenido y muestra una flecha verde en el icono de la carpeta.

  • Intentó git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Intentó 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)
    
  • Busqué cualquier archivo nombrado .gitmodulesen mi repositorio / directorio local pero no pude encontrar uno.

¿Qué debo hacer para que mis submódulos funcionen para que git pueda comenzar a rastrear correctamente?


Esto puede no estar relacionado (lo incluyo en caso de que ayude), pero cada vez que escribo en git commit -alugar de lo 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 en Github y, a pesar de intentar revisar la documentación, estoy un poco perplejo por estos problemas particulares. Gracias.

sscirrus
fuente
2
Estoy confundido acerca de algunas cosas. Uno: ¿por qué sigues diciendo github? todo lo que estás hablando suena local (excepto esa flecha verde, no sé nada de eso) ¿Es correcto o se trata de impulsar actualizaciones a github? Dos: ¿has hecho algo para crear este complemento como submódulo? Un submódulo es un repositorio git por derecho propio. Lo crea por separado, luego lo agrega al superproyecto.
Cascabel
1
Hm, la salida del estado de git sugiere que efectivamente hay un submódulo allí ... ¿pero realmente no tienes un archivo .gitmodules? Honestamente, si este complemento tiene su propio repositorio y sabe qué versión desea, puede eliminar ese directorio de su proyecto, asegurarse de que no haya una entrada en .gitmodules y pasar por la configuración del submódulo: git submodule add, git submodule update --init.
Cascabel
Jefromi: en realidad no he mencionado a Github más de dos veces, la primera vez es porque la flecha verde aparece en la parte superior de la imagen de la carpeta amarilla en el repositorio real de Github para open_flash_chart_2. Felizmente editaré la respuesta para que quede más clara.
sscirrus
1
@sscirrus: definitivamente debe tener una preferencia, submódulo o no. Si esto es algo externo en lo que no va a trabajar, pero de lo que puede querer actualizaciones, debería ser un submódulo. Si no le importa recibir actualizaciones de su repositorio original y puede querer hackear la fuente usted mismo, no debería ser un submódulo.
Cascabel
1
Esta pregunta parece ser puramente sobre submódulos git. Eliminé algunas etiquetas porque esta pregunta no está directamente relacionada con rails o github, se aplicaría a todos los casos de uso de git . Y la trackingetiqueta parece usarse para los temas de 'seguimiento de visitantes del sitio web', por lo que tampoco se aplicaría.
edgerunner

Respuestas:

239

Ha agregado vendor/plugins/open_flash_chart_2como entrada "gitlink", pero nunca la definió como un submódulo. Efectivamente, está utilizando la función interna que utiliza git submodule (entradas de gitlink) pero no está utilizando la función de submódulo en sí.

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 directorio vendor/plugins/open_flash_chart_2comienza como un repositorio Git independiente. Por lo general, estos sub-repositorios se ignoran, pero si le dice a git add que lo agregue explícitamente, creará una entrada gitlink que apunte a la confirmación HEAD del sub-repositorio en lugar de agregar el contenido del directorio. Puede ser 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) de la confirmación HEAD del submódulo. El "repositorio de origen" para la confirmación de un gitlink se especifica en el .gitmodulesarchivo (y el .git/configarchivo una vez que se ha inicializado el submódulo).

Lo que tiene es una entrada que apunta a una confirmación particular, sin registrar el repositorio de origen para esa confirmación. Puede solucionar esto ya sea convirtiendo su gitlink en un submódulo apropiado, o quitando el gitlink y reemplazándolo con contenido "normal" (archivos y directorios simples).

Convertirlo en un submódulo adecuado

Lo único que falta para definir correctamente vendor/plugins/open_flash_chart_2como un submódulo es un .gitmodulesarchivo. Normalmente (si aún no lo hubiera agregado como entrada desnuda de gitlink), 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 descubrió, esto no funcionará si la ruta ya existe en el índice. La solución es eliminar temporalmente la entrada 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 usará su sub-repositorio existente (es decir, no volverá a clonar el repositorio de origen) y organizará un .gitmodulesarchivo que se verá 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 repositorio principal .git/config(sin la pathconfiguración).

Compromételo y tendrás un submódulo adecuado. Cuando clona el repositorio (o presiona GitHub y clona desde allí), debería poder reinicializar el submódulo mediante git submodule update --init.

Reemplácelo con contenido simple

El siguiente paso asume que su sub-repositorio vendor/plugins/open_flash_chart_2no 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 repositorio secundario que le interesa, debe hacer una copia de seguridad del .gitdirectorio del repositorio secundario antes de eliminarlo en el segundo comando a continuación. (Considere también el subárbol git siguiente ejemplo de 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 repositorio secundario, por lo que los archivos se agregarán normalmente. Desafortunadamente, dado que eliminamos el .gitdirectorio, no hay una manera súper fácil de mantener las cosas actualizadas con el repositorio de origen.

Puede considerar usar una combinación de subárbol en su lugar. Hacerlo le permitirá introducir fácilmente los cambios desde el repositorio de origen mientras mantiene los archivos "planos" en su repositorio (sin submódulos). El comando git subtree de terceros es un buen envoltorio 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

git subtree también tiene una --squashopción que le permite evitar incorporar el historial del repositorio de origen en su historial, pero aún le permite incorporar cambios ascendentes.

Chris Johnsen
fuente
Chris, acabo de intentarlo rm -rf vendor/plugins/open_flash_chart_2/.gity dice que 'rm' no es reconocido. Luego lo intenté git rm -rf vendor/plugins/open_flash_chart_2/.gity dijo fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(¡pero puedo llegar allí en Windows Explorer!).
sscirrus
2
Discutimos el problema un poco en el chat . El OP pudo eliminar el .gitdirectorio del sub-repositorio y volver a agregar los archivos "de manera plana" (la primera opción de "Contenido simple").
Chris Johnsen
1
Esto me salvó mucho el culo el otro día. Accidentalmente agregué algo con un directorio .git a mi repositorio de git, y luego git-sorta pensó que tenía un submódulo, lo que estaba causando que mis git svn dcommits se volvieran locos. Te votaría 3 veces si pudiera.
davidtbernal
Quiero señalar, el complemento de terceros subtreeno debe confundirse con la combinación de subárbol. No es una envoltura. El autor lo dice: P
NebulaFox
@NebulaFox: Si bien git subtree no es solo una envoltura alrededor de las fusiones de subárboles, ciertamente utiliza las mismas técnicas que el procedimiento estándar de "fusión de subárboles" (es decir, git readtree --prefix=pathy las fusiones de subárboles: git mergecon -s subtreeo-Xsubtree=path ). También tiene buenos extras "en la parte superior": --squashmodo, splitcomando pushy pullayudantes.
Chris Johnsen
114

Acabo de tener el mismo problema. La razón fue porque había una subcarpeta que contenía una carpeta ".git". Eliminarlo hizo feliz a git.

neoneye
fuente
Sí, esto me pasó en AndroidStudio. El git repo ya se había creado en la carpeta / app mientras intentaba crear un git repo una carpeta arriba. Gracias.
ZirconCode
Tenía una aplicación angular creada por cli en muchas otras carpetas y esa carpeta tenía una carpeta .git: / ¡Ese es el verdadero problema, no las cosas de submódulos!
Pascal
esto funciona para mí ... He intentado agregar git muchas veces, pero no pasó nada. luego elimino la .gitcarpeta
Ninja
1
¿Pero qué pasa si todavía quiero rastrear mi subcarpeta? Qué tengo que hacer ?
cyber8200
Ten el mismo caso. Todavía quiero rastrear esa subcarpeta que tristemente contenía también una carpeta .git. Después de eliminar esta carpeta .git sufolder ya no se rastrea en mi carpeta principal .git .... :(
sqp_125
14
  1. Eliminé los directorios .git de esos nuevos directorios (esto puede crear un drama de submódulos. Google si está interesado).
  2. Luego ejecuté git rm -rf --cached / the / new / directorios
  3. Luego volví a agregar los directorios con un git add. desde arriba

URL de referencia https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

usuario2041369
fuente
6

Para señalar lo que tuve que desenterrar del chat de Chris Johansen con OP (vinculado desde una respuesta a una respuesta):

git add vendor/plugins/open_flash_chart_2 # agregará gitlink, el contenido permanecerá sin seguimiento

git add vendor/plugins/open_flash_chart_2/ # AVISO EL SLASH !!!!

La segunda forma lo agregará sin gitlink, y los contenidos son rastreables. El directorio .git se ignora conveniente y automáticamente. Gracias Chris!

Peter Lada
fuente
5

Utilizo el truco sugerido por Peter Lada todo el tiempo, denominado "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 toda mi configuración de Emacs en un repositorio, incluido el HEAD actual de todos los repositorios git dentro de los directorios del paquete elpa / el-get, por lo que podría retroceder / avanzar fácilmente a un conocido versión de trabajo cuando alguna actualización rompe algo).

Eloici
fuente
3

Tuve el mismo problema con un gran proyecto con muchos submódulos. Basado en las respuestas de Chris Johnsen aquí y VonC aquí , construyo un breve script bash que itera a través de todas las entradas existentes de gitlink y las agrega como submódulos adecuados.

#!/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 me lo arregló, espero que sea de alguna ayuda.

nicolas
fuente
2

Esto funcionó bien para mí:

git update-index --skip-worktree

Si no funciona con la ruta, intente con el nombre del archivo. Avísame si esto también funcionó para ti.

¡Adiós!

DarkCrazy
fuente
1

Tuve el mismo problema, pero no se resolvió en esta discusión.

También llegué al 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: leer los documentos nuevamente, 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 llegar al directorio de submódulos, hacer un "git add" + "git commit" para que todo el contenido sea 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 este nuevo HEAD del submódulo podría comprometerse con el módulo maestro.

Nerón
fuente
1

Recientemente encontré este problema mientras trabajaba en un proyecto de contrato (considerado clasificado). El sistema en el que tenía que ejecutar el código no tenía acceso a Internet, por supuesto, por razones de seguridad, por lo que instalar dependencias, usando composer y npm, se estaba convirtiendo en un gran dolor.

Después de mucha deliberación con mi colega, decidimos simplemente aletearlo y copiar y 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 me encontré con este problema.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Busqué en Google esto un poco y encontré este útil hilo en SO. No siendo demasiado 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 listo, funcionó. Sé que es un truco, y de todos modos no es muy geek. ¡Oh dioses de SO, por favor perdóname! La próxima vez prometo leer en gitlinks y obedecer a Oh poderoso Linus Tovalds.

SLearner
fuente
1

Esta pregunta ya ha sido respondida, pero pensé que agregaría a la mezcla lo que descubrí cuando recibí estos mensajes.

Tengo un repositorio llamado playgroundque contiene varias aplicaciones de sandbox. Agregué dos nuevas aplicaciones de un tutorial al playgrounddirectorio clonando el repositorio del tutorial. El resultado fue que las cosas de git de las nuevas aplicaciones apuntaban al repositorio del tutorial y no a mi repositorio. La solución fue eliminar el .gitdirectorio de cada uno de los directorios de esas aplicaciones, los directorios de mvlas aplicaciones fuera del playgrounddirectorio y luego mvvolver a ejecutarlos git add .. Después de eso funcionó.

Dana Scheider
fuente
1

Resolví este problema eliminando el archivo .git de mi subcarpeta.

  1. Primero elimine el archivo .git de su subcarpeta
  2. Luego elimine su subcarpeta de git ejecutando este código, git rm -rf --cached your_subfolder_name
  3. Luego, nuevamente agregue su carpeta mediante git add. mando
MehediTCF
fuente
0

Primero vaya al Directorio : vendor / plugins / open_flash_chart_2 y DELETE


LUEGO :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

SALIDA

En la sucursal maestra
Su sucursal está actualizada con 'origin / master'.
nada que comprometer, directorio de trabajo limpio

Program-Me-Rev
fuente