Domanda Rimuovi un file da un repository Git senza eliminarlo dal filesystem locale


Il mio commit iniziale conteneva alcuni file di registro. ho aggiunto *log al mio .gitignoree ora voglio rimuovere i file di registro dal mio repository.

git rm mylogfile.log

rimuoverà un file dal repository, ma lo rimuoverà anche dal file system locale.

Come posso rimuovere questo file dal repository senza cancellando la mia copia locale del file?


2434
2017-07-17 14:56


origine


risposte:


Per singolo file:

git rm --cached mylogfile.log

Per singola directory:

git rm --cached -r mydirectory

3496
2017-07-17 14:57



Per rimuovere un'intera cartella dal repository (come i file di Resharper), fai questo:

git rm -r --cached folderName

Avevo commesso alcuni file di resharper e non volevo che persistessero per altri utenti del progetto.


249
2018-04-04 18:14



Puoi anche rimuovere i file dal repository in base al tuo .gitignore senza eliminarli dal file system locale:

git rm --cached `git ls-files -i -X .gitignore`

Oppure, in alternativa, in Windows PowerShell:

git rm --cached $(git ls-files -i -X .gitignore)

162
2018-01-31 10:05



Inoltre, se hai eseguito il commit di dati sensibili (ad esempio un file contenente password), dovresti eliminarlo completamente dalla cronologia del repository. Ecco una guida che spiega come farlo: http://help.github.com/remove-sensitive-data/


66
2017-08-21 12:16



Come per la mia risposta qui: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Per rimuovere cartella / directory o file solo dal repository git e non dal locale, provare 3 semplici passaggi.


Passi per rimuovere la directory

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

Passi per ignorare quella cartella nei prossimi commit

Per ignorare quella cartella dai prossimi commit, creare un file nella radice denominato .gitignore   e metti il ​​nome di quella cartella in esso. Puoi metterne quanti ne vuoi

.gitignore il file sarà simile a questo

/FolderName

remove directory


58
2017-08-24 12:16



Una soluzione più generica:

  1. modificare .gitignore file.

    ECHO mylogfile.log >> .gitignore

  2. Rimuovi tutti gli oggetti dall'indice.

    git rm -r -f --cached .

  3. Ricostruisci indice.

    git add .

  4. Fai un nuovo commit

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Git ti consente di ignorare quei file assumendo che siano invariati. Questo   è fatto eseguendo il git update-index --assume-unchanged path/to/file.txt comando. Una volta contrassegnato un file come tale, git sarà   ignora completamente tutte le modifiche su quel file; non verranno visualizzati quando   eseguendo git status o git diff, né verranno mai commessi.

(A partire dal https://help.github.com/articles/ignoring-files)

Quindi, non cancellandolo, ma ignorando le modifiche ad esso per sempre. Penso che funzioni solo a livello locale, quindi i collaboratori possono ancora vedere le modifiche a meno che non eseguano lo stesso comando di cui sopra. (Ancora bisogno di verificare questo però.)

Nota: questo non risponde direttamente alla domanda, ma si basa su domande di follow-up nei commenti delle altre risposte.


17
2018-01-28 11:46



Le risposte sopra non hanno funzionato per me. Ho usato filter-branch per rimuovere tutti i file impegnati

rimuovere un file da un repository git con:

git filter-branch --tree-filter 'rm  file'

rimuovere una cartella da un repository git con:

git filter-branch --tree-filter 'rm -rf directory'

Ciò rimuove la directory o il file da tutti i commit

puoi specificare un commit usando:

git filter-branch --tree-filter 'rm -rf directory' HEAD

O un intervallo

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Per spingere tutto a distanza, puoi fare:

git push origin master --force

4
2018-01-12 13:59