Come posso eliminare un file da un repository Git?


1924

Ho aggiunto un file chiamato "file1.txt"a un repository Git. Dopodiché, l'ho impegnato, ho aggiunto un paio di directory chiamate dir1e dir2, e le ho impegnate nel repository Git.

Ora il repository corrente ha "file1.txt", dir1e dir2. Come posso eliminare "file1.txt"senza influire su altri, come dir1e dir2?


85
git rmè la risposta giusta, ma ricorda che il file sarà ancora presente nella cronologia. Se vuoi rimuovere un file perché aveva informazioni sensibili, dovrai fare qualcosa di più drastico. (La modifica della cronologia, in particolare per i contenuti che hai già spinto, è un'azione drastica e dovrebbe essere evitata se possibile.)
Keith Thompson,

8
Nota: su GitHub, ora è possibile eliminare direttamente un file dall'interfaccia Web (senza nemmeno clonare il repository). Vedi la mia risposta qui sotto .
VonC,

4
@KeithThompson quali passi potrebbero essere se volessi disperatamente farlo?
lessthanl0l


Risposte:


3224

Usa git rm.

Se vuoi rimuovere il file dal repository Git e dal filesystem , usa:

git rm file1.txt
git commit -m "remove file1.txt"

Ma se vuoi rimuovere il file solo dal repository Git e non rimuoverlo dal filesystem, usa:

git rm --cached file1.txt
git commit -m "remove file1.txt"

E per inviare le modifiche al repository remoto

git push origin branch_name  

93
Utile anche: git rm -r directory // Per rimuovere directory e contenuti
Reg

10
Tuttavia, questo non eliminerà quel file in altri commit.
Va

6
@SaulOrtega: Esatto. Per rimuovere un file da commit precedenti (modifica della cronologia passata), consultare la pagina di aiuto di GitHub su Rimuovi dati sensibili .
Greg Hewgill,

15
Prendi nota che anche questo eliminerà il file localmente. Se si desidera solo eliminarlo dal repository fare: git rm --cached file1.txt
Weston Ganger

5
Vale la pena notare che se quel file conteneva informazioni sensibili (ad es. Credenziali) è necessario modificarle immediatamente . Per citare GitHub "Dopo aver inviato un commit a GitHub, dovresti considerare compromessi tutti i dati in esso contenuti. Se hai inserito una password, modificala! Se hai eseguito il commit di una chiave, generane una nuova."
c1moore,

608

git rm file.txtrimuove il file dal repository ma lo elimina anche dal file system locale .

Per rimuovere il file dal repository e non eliminarlo dal file system locale, utilizzare:
git rm --cached file.txt

La situazione esatta di seguito è quella in cui utilizzo git per mantenere il controllo della versione per il sito Web della mia azienda, ma la directory "mickey" era una cartella tmp per condividere contenuti privati ​​con uno sviluppatore CAD. Quando aveva bisogno di file ENORMI, ho creato una directory privata non collegata e ho ftpd lì i file per poterlo recuperare tramite browser. Dimenticando di averlo fatto, in seguito ho eseguito un git add -Adalla directory di base del sito Web. Successivamente, ha git statusmostrato i nuovi file che richiedono il commit. Ora dovevo eliminarli dal monitoraggio di git e dal controllo della versione ...

L'output di esempio riportato di seguito è quello che mi è appena successo, in cui ho eliminato il .003file involontariamente . Per fortuna, non mi interessa cosa è successo alla copia locale .003, ma alcuni degli altri file attualmente modificati erano aggiornamenti che avevo appena fatto sul sito Web e sarebbe stato epico essere stati cancellati sul file system locale! "File system locale" = il sito Web live (non è una buona pratica, ma è la realtà) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Aggiornamento: questa risposta sta ottenendo un po 'di traffico, quindi ho pensato di menzionare la mia altra risposta Git che condivide un paio di grandi risorse: questa pagina ha un grafico che aiuta a demistificare Git per me. Il libro "Pro Git" è online e mi aiuta molto.


6
Dovresti quindi impegnarlo con qualcosa di simile git commit -m "Just removing file1.txt"e, se hai un repository remoto, spingere il commit con qualcosa di simile git push origin master.
divieto di geoingegneria il

77

Innanzitutto, se si utilizza git rm, in particolare per più file, considerare che qualsiasi carattere jolly verrà risolto dalla shell, non dal gitcomando.

git rm -- *.anExtension
git commit -m "remove multiple files"

Ma, se il tuo file è già su GitHub, puoi (da luglio 2013) eliminarlo direttamente dalla GUI Web!

Basta visualizzare qualsiasi file nel repository, fare clic sull'icona del cestino in alto e confermare la rimozione come qualsiasi altra modifica basata sul Web.

Quindi " git pull" sul tuo repository locale e anche questo eliminerà il file localmente.
Ciò che rende questa risposta un modo (rotonda) per eliminare un file dal repository git?
(Per non parlare del fatto che un file su GitHub è in un "repository git")


pulsante Elimina

(il commit rifletterà la cancellazione di quel file):

commettere una cancellazione

E proprio così, non c'è più.

Per assistenza con queste funzionalità, assicurati di leggere i nostri articoli della guida sulla creazione , lo spostamento , la ridenominazione e l' eliminazione dei file.

Nota: poiché si tratta di un sistema di controllo della versione, Git ha sempre le spalle se è necessario ripristinare il file in un secondo momento.

L'ultima frase indica che il file eliminato fa ancora parte della cronologia e puoi ripristinarlo abbastanza facilmente (ma non ancora tramite l'interfaccia web di GitHub):

Vedere " Ripristina un file eliminato in un repository Git ".


4
Devi scorrere verso il basso e premere "Salva modifiche" per confermare l'eliminazione!
LevinsonTechnologies

1
Questo non funziona per file di testo di grandi dimensioni. Il server tenta di eseguire il rendering del file come nello screenshot e quindi non riesce con un errore 500.
CapeCoder

9
Questa risposta si riferisce a github, la domanda riguarda un repository git. Non come usare l'interfaccia di github.
Peter Marshall,

65

Questa è l'unica opzione che ha funzionato per me.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Nota: sostituire * .sql con il nome o il tipo di file. Fai molta attenzione perché questo passerà attraverso ogni commit e strapperà questo tipo di file.

EDIT: presta attenzione - dopo questo comando non sarai in grado di spingere o tirare - vedrai il rifiuto di "cronologia non correlata", puoi usare "git push --force -u origin master" per spingere o tirare


9
Questa è un'ottima risposta, ma nota che a differenza delle altre risposte, questo comando riscrive la cronologia del commit e rimuove tutte le tracce dei file corrispondenti al modello. Ciò è particolarmente utile se hai scoperto di aver commesso accidentalmente alcune informazioni sensibili (e, se necessario, puoi utilizzare con successo --force per riscrivere la cronologia di tutti i repository remoti a cui è stato inviato).
yoniLavi,

3
Quello era esattamente il problema che avevo e ci sono voluti alcuni tentativi ed errori per farlo bene. Un ragazzo con cui stavo lavorando aveva impegnato diversi grandi dump di database in un repository risalendo a molti numerosi commit. Ecco perché ho usato .sql nel mio esempio. Il mio repository è diventato così gonfio e grande che Github non avrebbe più accettato le spinte.
Jason Glisson,

3
Se si utilizza un master remoto, è necessario forzare un commit e git push --force -u origin master
inviarlo

2
@AlbertMarkovski Mi dispiace non ero specifico. Github in realtà non accetterebbe la spinta perché il repo era oltre il loro limite di dimensioni. Almeno diversi GB. Mi hanno interrotto e me ne hanno mandato un'email. Quindi, sfortunatamente, nessuna quantità di forzare una spinta aiuterebbe a quel punto.
Jason Glisson,

2
@JasonGlisson Ho anche affrontato quel problema in cui un video è stato aggiunto per caso a un repository.
AlbertMarkovski,

34

Inoltre, se è una cartella da rimuovere e le successive cartelle o file secondari, utilizzare:

git rm -r foldername

2
Questo rimuove anche la cartella dal locale! Use git rm --cached -r <foldername>
Asse

24

Più in generale, git helpaiuterà con almeno semplici domande come questa:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

6
Per cose più complesse, trovo git helpconfuso, ma è buono per le cose semplici :)
James Polley,

9
In realtà non è eccezionale per git noobs perché "index" non è un concetto con cui git noobs ha familiarità. Parlo per esperienza personale di essere un git noob :) Inoltre, mi sembra molto meno confuso dire che mette in rm scena un file per la cancellazione piuttosto che rimuoverlo dall'indice (anche se è ancora insignificante per i noob).
Roman Starkov,

Accordo con romkyns: la descrizione "Rimuovi i file dall'albero di lavoro e dall'indice" non mi suona come se fosse un modo per rimuovere il file dal repository. Forse se capissi meglio GIT, lo farebbe. Invece sembra che tu stia solo cancellando i file (e opzionalmente rimuovendoli dall'albero di lavoro - ciò influirebbe necessariamente sul repository?)
LarsH

14

Se si desidera eliminare il file dal repository, ma lasciarlo nel file system (non verrà tracciato):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Se si desidera eliminare il file dal repository e dal file system, ci sono due opzioni:

  1. Se il file non presenta modifiche organizzate nell'indice:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Se il file presenta modifiche organizzate nell'indice:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm d'ora in poi rimuoverà il file su questo ramo, ma rimarrà nella storia e git lo ricorderà.

Il modo giusto per farlo è con git filter-branch, come altri hanno menzionato qui. Riscriverà ogni commit nella cronologia del ramo per eliminare quel file.

Ma, anche dopo averlo fatto, git può ricordarselo perché ci possono essere riferimenti ad esso in reflog, telecomandi, tag e simili.

Se vuoi cancellarlo completamente in un solo passaggio, ti consiglio di usarlo git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

È facile, basta git forget-blob file1.txt.

Questo rimuoverà ogni riferimento, git filter-brancheseguirà e infine eseguirà git garbage collector git gcper eliminare completamente questo file nel repository.


10

Un altro modo se si desidera eliminare il file dalla cartella locale utilizzando il comando rm e quindi inviare le modifiche al server remoto.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

Nota: se si desidera eliminare il file solo da Git, utilizzare di seguito:

git rm --cached file1.txt

Se si desidera eliminare anche dal disco rigido:

git rm file1.txt

Se si desidera rimuovere una cartella (la cartella può contenere pochi file), è necessario rimuovere utilizzando il comando ricorsivo, come di seguito:

git rm -r foldername

Se si desidera rimuovere una cartella all'interno di un'altra cartella

git rm -r parentFolder/childFolder

Quindi, puoi commite pushcome al solito. Tuttavia, se si desidera ripristinare la cartella eliminata, è possibile seguire questa procedura: è possibile ripristinare i file eliminati da git.

Da doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPZIONI

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

potrebbe essere necessario evadere dalla shell. Un nome di directory principale (ad es. Dir per rimuovere dir / file1 e dir / file2) può essere dato per rimuovere tutti i file nella directory e ricorsivamente tutte le sottodirectory, ma ciò richiede che l'opzione -r sia data esplicitamente. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opzioni della riga di comando). --cached

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

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Maggiori informazioni sul documento ufficiale.


7

Per eliminare un file specifico

git rm nomefile

Per pulire tutti i file non tracciati da una directory in modo ricorsivo in colpo singolo

git clean -fdx


5

Se hai l'applicazione GitHub per Windows, puoi eliminare un file in 5 semplici passaggi:

  • Fai clic su Sincronizza.
  • Fare clic sulla directory in cui si trova il file e selezionare la versione più recente del file.
  • Fai clic sugli strumenti e seleziona "Apri una shell qui".
  • Nella shell, digita: "rm {nomefile}" e premi invio.
  • Conferma la modifica e risincronizza.

5

Nel mio caso ho provato a rimuovere il file su github dopo alcuni commit ma salvarlo sul computer

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

e in seguito questo file è stato ignorato


3
  1. Innanzitutto, rimuovere i file dal repository locale.

    git rm -r Nome file

    oppure, rimuovere i file solo dal repository locale ma dal filesystem

    git rm - Nome file nella cache

  2. In secondo luogo, commit delle modifiche nel repository locale.

    git commit -m "unwanted files or some inline comments"   
    
  3. Infine, aggiorna / invia le modifiche locali nel repository remoto.

    git push 
    

ciò eliminerebbe tutto ciò che è correlato al file aggiunto e inserito accidentalmente?
Bapors,

1

Ho provato molte delle opzioni suggerite e nessuna sembrava funzionare (non elencherò i vari problemi). Quello che ho finito per fare, che ha funzionato, è stato semplice e intuitivo (per me) è stato:

  1. spostare l'intero repository locale altrove
  2. clonare nuovamente il repository dal master all'unità locale
  3. copia di nuovo i file / la cartella dalla tua copia originale in # 1 nel nuovo clone da # 2
  4. assicurarsi che il file di grandi dimensioni del problema non sia presente o escluso nel file .gitignore
  5. fai il solito git aggiungi / git commit / git push

1

Dopo aver rimosso il file dal repository, git rmè possibile utilizzare BFG Repo-Cleaner per cancellare completamente e facilmente il file dalla cronologia del repository.


0

Ho file obj e bin che sono entrati accidentalmente nel repository che non voglio inquinare il mio elenco di "file modificati"

Dopo aver notato che sono andati al telecomando, li ho ignorati aggiungendo questo a.gitignore

/*/obj
/*/bin

Il problema è che si trovano già nel telecomando e quando vengono modificati vengono visualizzati come modificati e inquinano l'elenco dei file modificati.

Per smettere di vederli, è necessario eliminare l'intera cartella dal repository remoto.

Al prompt dei comandi:

  1. CD nella cartella repo (es. C:\repos\MyRepo)
  2. Voglio eliminare SSIS \ obj. Sembra che tu possa cancellare solo al livello più alto, quindi ora devi CD in SSIS: (es. C:\repos\MyRepo\SSIS)
  3. Ora digita l'incantesimo magico git rm -r -f obj
    • rm = rimuovi
    • -r = rimuove ricorsivamente
    • -f = significa forza, perché la intendi davvero
    • obj è la cartella
  4. Adesso corri git commit -m "remove obj folder"

Ho ricevuto un messaggio allarmante che diceva che 13 file hanno cambiato la cancellazione 315222

Quindi, poiché non volevo cercare la linea CMD, sono entrato in Visual Sstudio e ho fatto una sincronizzazione per applicarlo al telecomando


0

Se è necessario rimuovere i file da un'estensione determinata (ad esempio, i file compilati) è possibile effettuare le seguenti operazioni per rimuoverli tutti in una volta:

git remove -f *.pyc

0

Secondo la documentazione .

git rm --cached giant_file

Quando si tratta di dati sensibili, meglio non dire che hai rimosso il file, ma piuttosto includerlo nell'ultimo commit noto:

0. Modifica l'ultimo commit

git commit --amend -CHEAD

Se si desidera eliminare il file da tutta la cronologia di Git, in base alla documentazione è necessario eseguire le seguenti operazioni:

1. Rimuovilo dalla cronologia locale

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Non dimenticare di includere questo file in .gitignore (se è un file che non vuoi condividere (come password ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Se è necessario rimuovere dal telecomando

git push origin --force --all

4. Se è necessario rimuoverlo anche dalle versioni dei tag:

git push origin --force --tags

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.