2011-01-27 27 views
52

Tengo una carpeta bajo control de versión. Quiero hacer una copia para enviar, pero no quiero incluir todos los directorios .git y los archivos debajo.¿Eliminar todos los archivos de git de un directorio?

¿Hay alguna manera de eliminar todos los archivos de git en lugar de eliminarlos manualmente?

+0

Puede escribir un pequeño script para hacer esto, pero eso sería específico del sistema operativo. – Matten

Respuesta

76

La carpeta .git solo se almacena en el directorio raíz del repositorio, no en todos los subdirectorios, como subversión. Debería poder simplemente eliminar esa única carpeta, a menos que esté usando Submódulos ... entonces ellos también tendrán una.

+6

¡Ah terrific, pensaba que se distribuía entre todos los subdires como svn! – user291701

+6

¿Por qué * eliminar *? Use 'git archive'; es para este propósito, o incluso solo para todo excepto el directorio .git. – Cascabel

+1

Es posible que también desee eliminar su archivo '.gitignore' y tal. Supongo que podría escribir un script para hacer eso, pero podría ser más simple usar git-archive y luego eliminarlo manualmente de la versión archivada. – MatrixFrog

1

A diferencia de otros sistemas de control de origen como SVN o CVS, Git almacena todos sus metadatos en un directorio único , en lugar de en cada subdirectorio del proyecto. Así que simplemente elimine .git de la raíz (o use un script como git-export) y debería estar bien.

13

Puede utilizar git-archive, por ejemplo:

git archive master | bzip2 > project.tar.bz2 

Dónde master es la rama deseada.

+0

esto lleva 2h frente a' cp -r' instantáneo – gcb

+2

@gcb: 'cp -r' no trata con archivos y directorios que son no es parte del repositorio, que también incluye los ignorados. Sin embargo, si está seguro de que no necesita esto y su procesamiento/tiempo es crítico, seguro, continúe con 'cp'. – jweyrich

+4

Para ser justos, 'git archive' tiene un inconveniente: no exporta submódulos. Uno necesitaría 'git submodule foreach --recursive git archive ...'. ¡Extremadamente malo! – jweyrich

4

En caso de que alguien más tropiece con este tema, aquí hay una solución más "de talla única".

Si está utilizando .git o .svn, puede usar la opción --exclude-vcs para tar. Esto ignorará muchos archivos/carpetas diferentes requeridos por diferentes sistemas de control de versiones.

Si desea leer más sobre ello, echa un vistazo a: http://www.gnu.org/software/tar/manual/html_section/exclude.html

34

Cómo quitar todos los directorios .git en una carpeta en Linux.

Este comando encontrará una lista de todos .git directorios bajo la carpeta actual:

find . -type d -name ".git" \ 
&& find . -name ".gitignore" \ 
&& find . -name ".gitmodules" 

Prints:

./.git 
./.gitmodules 
./foobar/.git 
./footbar2/.git 
./footbar2/.gitignore 

Sólo debe haber como 3 o 4 .git directorios porque git sólo tiene una. carpeta git para cada proyecto. Puedes hacer esos a mano.

Si usted se siente como la eliminación de todos en un solo mando y vivir peligrosamente:

//Retrieve all the files named ".git" and pump them into 'rm -rf' 
//WARNING if you don't understand why/how this command works, DO NOT run it! 

(find . -type d -name ".git" \ 
    && find . -name ".gitignore" \ 
    && find . -name ".gitmodules") | xargs rm -rf 

//WARNING, if you accidentally pipe a `.` or `/` to xargs rm -rf, 
//then everything will be gone. Which requires an OS reinstall. 
+0

@Jay Taylor, ¿escribo las barras diagonales inversas o es parte del comando? –

+0

Sí, las barras posteriores son para facilitar la lectura. De esta forma, supongo que califica como un "comando de varias líneas". –

+0

Considere eliminar la carpeta '.repo' (en la parte superior del árbol) al eliminar todas las carpetas relacionadas con Git (si se está ejecutando el desarrollo de Android). http://source.android.com/source/developing.html – CJBS

6

cd al repositorios, entonces

find . -name ".git*" -exec rm -R {} \; 

hacer el trabajo para mí

+0

Esto es genial, pero recibo un aviso después de 'find: ./.git: No such such or directory' works though. De todos modos para evitar que se muestre el aviso? –

0

ls | xargs encuentra 2>/dev/null | egrep /\.git$ | xargs rm -rf

Este comando (y es solo un comando) eliminará recursivamente directorios .git (y archivos) que están en un directorio sin eliminar el repo de git de nivel superior, que es útil si desea comprometa todos sus archivos sin administrar ningún submódulo.

buscar 2>/dev/null | egrep /\.git$ | xargs rm -rf

Este comando hará lo mismo, pero también eliminará la carpeta .git del directorio de nivel superior.

Cuestiones relacionadas