¿Cómo eliminar archivos sin seguimiento en Git?

110

Estoy trabajando en una rama, digo rama "experimental" que me ramifico desde mi rama maestra. Luego, genero un modelo de usuario en la rama experimental, pero todavía no lo agrego al índice.

¿Qué tengo que hacer si quiero descartar todos los cambios de los archivos agregados recientemente en mi rama experimental? Los archivos sin seguimiento se enumeran a continuación:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

Intenté ejecutar "git reset --hard" con la esperanza de deshacer todos esos cambios, pero todavía se muestran todos los archivos anteriores.

¿Alguien, por favor, me arrojó algo de luz?

Sarun Sermsuwan
fuente

Respuestas:

220

Para eliminar archivos / directorios sin seguimiento, haga lo siguiente:

git clean -fdx

-f - fuerza

-d - directorios también

-x: también elimina los archivos ignorados (no lo uses si no quieres eliminar los archivos ignorados)

manojlds
fuente
54
Agregue -n para obtener una vista previa primero para que no elimine cosas accidentalmente
Druska
8
¡Esto es genial! Excepto que también eliminará los archivos de configuración que podría haber ignorado intencionalmente en .gitignore pero que aún necesita para su entorno de desarrollo local. Puede usar el mismo comando con el extra -i para el modo interactivo como tal: git clean -fdxi y le preguntará qué archivos desea eliminar.
moeabdol
5
Esto es genial, pero es posible que desee agregar un aviso a los usuarios para que lo utilicen -xcon precaución porque eliminará los archivos de forma permanente. O use con -ncomo lo menciona @Druska
lacostenycoder
3
-xAún no se usó el .project y otros archivos de configuración se eliminaron. Tuve que extraer el repositorio nuevamente desde la última confirmación en un nuevo directorio.
cronometrador
2
Creo que debe informar que este comando es potencialmente peligroso porque puede eliminar archivos deseados.
Davide
20

Enfoque interactivo del usuario:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i para interactiva
-f para la fuerza
-d para el directorio
-x para ficheros ignorados (añadir, si es necesario)

Nota: Añadir -n o ---dry ejecutar simplemente comprobar lo que hará.

bit_cracker007
fuente
17

Esos son archivos sin seguimiento. Esto significa que git no los está rastreando. Solo los enumera porque no están en el archivo git ignore. Como no están siendo rastreados por git, git resetno los tocará.

Si desea eliminar todos los archivos sin seguimiento, la forma más sencilla es git clean -f(use git clean -nen su lugar si desea ver lo que destruiría sin eliminar nada). De lo contrario, puede eliminar los archivos que no desea a mano.

Lily Ballard
fuente
5

Para eliminar archivos sin seguimiento:

git clean -f

Para eliminar también directorios sin seguimiento, use:

git clean -f -d

Para prevenir cualquier paro cardíaco, utilice

git clean -n -f -d

Sonu Mishra
fuente
Cualquier "paro cardíaco" 😂😂😂
Rishi Kulshreshtha
2

También puede volver al estado anterior del repositorio local de otra manera:

  1. Agregue los archivos sin seguimiento al área de preparación con git add.
  2. volver al estado anterior del repositorio local con git reset --hard.
Tomasz Nazarenko
fuente
1

El comando para tu rescate es git clean.

Jagriti Kumari
fuente
0

Bueno, tuve un problema similar. Había tomado el último, pero hubo algunos cambios en el local debido a que la fusión no se estaba produciendo en un archivo en particular. El archivo no se rastreó y no los quería, así que lo que hice fue ...

$ git checkout ruta de archivo / nombre de archivo

filepath: la ubicación desde donde hice el git bash. luego, cuando tomé el último, los cambios estaban disponibles

skb
fuente
0

Si git cleanbien funciona bien, todavía me resulta útil usar mi propio script para limpiar el repositorio de git, tiene algunas ventajas.

Esto muestra una lista de archivos que se deben limpiar, luego interactivamente solicita limpiar o no. Esto es casi siempre lo que quiero, ya que la solicitud interactiva por archivo se vuelve tediosa.

También permite el filtrado manual de la lista, lo que resulta útil cuando hay tipos de archivos que no desea limpiar (y tiene motivos para no comprometerse).


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
ideasman42
fuente