¿Cómo hago una limpieza con git como rcsclean

estoy acostumbrado a los rcs . Después de registrarme, suelo hacer un rcsclean para eliminar todas las multas registradas que están presentes, de modo que solo los files sin seguimiento estén presentes en el directory. A veces hago un rcsclean -u para deshacer cualquier file cambiado a rastreado.

¿Cómo hago esto en git?

después, solo debe haber files sin seguimiento en el directory actual y sus subdirectorys (excepto, por supuesto, para el propio repository .git).

TL; DR

Git no es RCS. Puedes hacer lo que quieras, pero te causarás sufrimiento a largo ploop tratando de tratar un repository de Git como un sistema de control de revisiones basado en files.

Puede eliminar los files que Git está rastreando, pero los proyectos con treees de directorys más grandes / más profundos requerirán que tome medidas adicionales para eliminar los directorys vacíos (que Git no rastrea como objects de primera class), y perderá la capacidad de hacerlo cosas como git commit -a sin que Git piense que estás borrando todos tus files.

Eliminar files y directorys

Puede eliminar todos los files que conoce Git utilizando el subcommand ls-files . Debe canalizar la salida a xargs porque el command rm no maneja cadenas terminadas en nulo de forma nativa, y routes como "foo bar / baz quux" causarían problemas sin ellas.

Para eliminar todos los files comprometidos con Git:

 $ git ls-files -z | xargs -0 -- rm -f 

Sin embargo, Git no rastrea realmente los directorys; rastrea treees . Por lo tanto, a less que tenga todos sus files en la raíz del proyecto, tendrá que eliminar los directorys vacíos usted mismo como un command separado si quiere que se vayan también. Por ejemplo:

 $ find . -type d -empty -not -path '*.git*' 

Comandos para evitar después de la limpieza

Una vez que haya hecho esto, tendrá que evitar commands como git commit -a que tratará todos los files faltantes como eliminados. En cambio, tendrás que representar los files mucho más cuidadosamente. También es posible que desee investigar man git-update-index y considerar si el --assume-unchanged lo ayudará o lo empeorará.

Además, el command de git status continuará mostrando muchos cambios porque ha eliminado files del tree de trabajo. Si tiene una gran cantidad de files que ha "limpiado" de su tree de trabajo, la salida de commands como el git status puede llegar a ser tan abarrotada que se vuelva inútil sin filtrar. Por ejemplo, para search files que realmente no se han rastreado en lugar de eliminarlos o modificarlos:

 $ git status -su | fgrep '??' ?? bar ?? wibble 

Usa el estado de Git

Git y RCS tienen diferentes casos de uso. Es extremadamente inusual querer borrar tu tree de trabajo de Git, así que supongo que se trata de un problema de X / Y en el que intentas ver qué files no se han rastreado actualmente.

Hay un command Git incorporado para esto: git status --untracked-files . El modo pnetworkingeterminado de este command es todo , a diferencia del resultado del git status de git status (sin indicadores) que por defecto es normal . Consulte man 1 git-status para más detalles.

Ejemplo

 mkdir -p foo/bar/baz touch foo/quux foo/bar/wibble git status -u 
 On branch master Untracked files: (use "git add <file>..." to include in what will be committed) foo/bar/wibble foo/quux nothing added to commit but untracked files present (use "git add" to track) 

Advertencia: treees de directory vacíos

Tenga en count que los treees de directorys sin files nunca se muestran en esta salida. Eso es porque Git no rastrea directorys excepto como parte de objects de tree, por lo foo/bar/baz de este ejemplo nunca se mostrará como no rastreado a less que exista un file (input de directory conocido) dentro o debajo de baz en el tree de directorys.

En otras palabras, para que baz se muestre como no rastreado, debe haber un file en baz o un subdirectory de baz debe contener un file. Por ejemplo, usando la bandera --short para get un resultado más conciso:

 $ touch foo/bar/baz/file; git status -s -u ?? foo/bar/baz/file ?? foo/bar/wibble ?? foo/quux 

includeá foo/bar/baz/file en la salida. La gente a menudo usa files ocultos vacíos como .gitkeep solo para este propósito.