2012-04-19 19 views
7

Solución: elimine --cached de git rm -r --cached submodule/name. Scripted de referencia.git rm -r --cached no elimina la carpeta y el contenido del submódulo


estoy tratando de eliminar un submódulo Git basado en this SO answer, pero no se va a quitar el submódulo.

Agrego el submódulo, confirmo los cambios, luego lo borro usando git rm -r --cached $path/to/submodule (menos el final /), confirmo los cambios, pero el submódulo aún está allí.

Puedo usar rm -rf submodules/lift_sbt_24 para eliminar la carpeta y el contenido, pero ¿por qué no está git rm -r --cached haciendo eso?

(supresión de la sección correspondiente de .gitmodules funciona bien, no es ningún problema, por lo tanto, no se mencionan aquí)

Ésta es Git 1.7.5.4 en Ubuntu 11.10, fwiw. Ejemplo completo:

$> git submodule add [email protected]:lift-stack/lift_24_sbt.git submodules/lift_24_sbt 
Adding submodule from repo [email protected]:lift-stack/lift_24_sbt.git as submodules/lift_24_sbt 
Cloning into submodules/lift_24_sbt... 
remote: Counting objects: 619, done. 
remote: Compressing objects: 100% (375/375), done. 
remote: Total 619 (delta 172), reused 593 (delta 147) 
Receiving objects: 100% (619/619), 1.74 MiB | 112 KiB/s, done. 
Resolving deltas: 100% (172/172), done. 
$> git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commits. 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: .gitmodules 
# new file: submodules/lift_24_sbt 
# 
$> git add -a 
$> git commit 'added submodules/lift_24_sbt' 
[master 9894113] update 
2 files changed, 4 insertions(+), 0 deletions(-) 
create mode 160000 submodules/lift_24_sbt 
$> git rm -r --cached submodules/lift_24_sbt 
rm 'submodules/lift_24_sbt' 
$> git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commits. 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# deleted: submodules/lift_24_sbt 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# submodules/lift_24_sbt/ 
$> git add -a 
$> git commit -m 'deleted submodules/lift_24_sbt' 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commits. 
# 
nothing to commit (working directory clean) 
$> ls -al submodules/lift_24_sbt/ 
total 1060 
drwxr-xr-x 5 kurtosis kurtosis 4096 2012-04-18 17:26 ./ 
drwxrwxr-x 6 kurtosis kurtosis 4096 2012-04-18 17:26 ../ 
drwxrwxr-x 8 kurtosis kurtosis 4096 2012-04-18 17:32 .git/ 
drwxrwxr-x 2 kurtosis kurtosis 4096 2012-04-18 17:26 project/ 
drwxrwxr-x 3 kurtosis kurtosis 4096 2012-04-18 17:26 src/ 
-rw-rw-r-- 1 kurtosis kurtosis  931 2012-04-18 17:26 build.sbt 
-rw-rw-r-- 1 kurtosis kurtosis  463 2012-04-18 17:26 .gitignore 
-rw-rw-r-- 1 kurtosis kurtosis  91 2012-04-18 17:26 README.md 
-rwxrwxr-x 1 kurtosis kurtosis  110 2012-04-18 17:26 sbt* 
-rw-rw-r-- 1 kurtosis kurtosis  131 2012-04-18 17:26 sbt.bat 
-rw-rw-r-- 1 kurtosis kurtosis 1041753 2012-04-18 17:26 sbt-launch.jar 
$> git --version 
git version 1.7.5.4 

Respuesta

12

Lo que está viendo es correcto; git rm --cached -r hace no, de hecho, elimina los archivos del working tree, solo del index. Si desea git para eliminar los archivos de indexyworking tree, no debe usar --cached. Consulte el git-rm man page para obtener más información.


A continuación hay una explicación de lo que hizo. Supongo que escribiste los pasos que tomaste, en lugar de copiar desde una terminal; por lo que yo sé, git add -a es not a known git-add flag; También estoy bastante seguro de que también se refería al git commit -m <message>.

Los pasos de corte hacia abajo que ha tomado:


# First, add the submodule. 
$> git submodule add [email protected]:lift-stack/lift_24_sbt.git submodules/lift_24_sbt 
# Check that the submodule exists. (It does). 
$> git status 
# Add everything to the staging area from the working tree. 
$> git add -a 
# Commit all changes. 
$> git commit 'added submodules/lift_24_sbt' 

En este punto, agregó correctamente el módulo, y todo está funcionando como se esperaba.
Lo que intenta hacer a continuación es a eliminar el módulo:

$> git rm -r --cached submodules/lift_24_sbt 

Nota: aquí, hacemos no eliminar los archivos de la working index, única del index, debido la --cached:

--cached 
     Use this option to unstage and remove paths only from the index. Working tree 
     files, whether modified or not, will be left alone. 

A continuación, comprobar que hemos eliminado el submódulo:

$> git status 
... <snip> 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# deleted: submodules/lift_24_sbt 

Como se puede ver, el submódulo ha sido eliminado, y todo es bueno. Tenga en cuenta, sin embargo, que los archivos todavía existen en el árbol de trabajo - aún puede verlos con ls.:)

+0

Gracias, y sí quise decir 'git add -A' y' git commit -m'. Se eliminó --cached de 'git rm -r $ 1' y [con guión] (https://github.com/byrongibson/scripts/blob/master/git-rm-submodule.sh). Quizás no sea prudente hacer esto en un script, pero al menos es útil como referencia paso a paso. – Kurtosis

1

Puede tratar de simpliyfy la secuencia de comandos, mediante el uso de un nuevo comando (git1.8.3, 22d de abril de 2013), detallada en una nueva respuesta a "How do I remove a Git submodule?":

git submodule deinit 

Debe quitar el árbol de trabajo del submódulo, así como anular el registro desde .git/config.

Cuestiones relacionadas