Kako mogu učiniti da Git "zaboravi" na datoteku koja je praćena, ali je sada u .gitignore?

Postoji datoteka koja se prati putem git , ali sada je datoteka na popisu .gitignore .

Međutim, ta se datoteka i dalje prikazuje u git status nakon uređivanja. Kako to da git potpuno zaboravi na to?

4082
13 авг. set Ivan 13 aug. 2009-08-13 22:23 '09 u 10:23 AM 2009-08-13 22:23
@ 22 odgovora

.gitignore spriječit .gitignore datoteka bez zapisa (bez add -f ) skupu datoteka koje prati git, ali git će nastaviti pratiti sve datoteke koje su već praćene.

Da biste zaustavili praćenje datoteke, morate je ukloniti iz indeksa. To se može postići uporabom ove naredbe.

 git rm --cached <file> 

Brisanje datoteke iz zaglavlja revizije dogodit će se prilikom sljedećeg urezivanja.

NAPOMENA: Iako to neće ukloniti fizičku datoteku iz vaše lokalne datoteke, ona će izbrisati datoteke s računala drugih programera s sljedećim git pull .

4329
13 авг. Odgovor dao CB Bailey 13. kolovoza 2009-08-13 23:40 '09 u 23:40 2009-08-13 23:40

U nizu naredbi u nastavku, sve stavke iz indeksa Git bit će izbrisane (ne iz radnog imenika ili lokalnog repoa), a zatim će Git indeks biti ažuriran, dok će Git biti ignoriran. PS. Index = Cache

Prvo:

 git rm -r --cached . git add . 
border=0

zatim:

 git commit -am "Remove ignored files" 
2209
30 сент. Odgovor daje Matt Frear 30 sep . 2013-09-30 16:51 '13 u 16:51 2013-09-30 16:51

git update-index radi sav posao za mene:

 git update-index --assume-unchanged <file> 

Napomena. Ovo rješenje je praktički neovisno o .gitignore jer je gitignore namijenjen samo za datoteke bez zapisa.

promjena: budući da je ovaj odgovor objavljen, stvorena je nova opcija, a to bi trebalo dati prednost. Trebali biste koristiti --skip-worktree koji je namijenjen izmijenjenim nadgledanim datotekama koje korisnik više ne želi popraviti, a sprema --assume-unchanged za bolju izvedbu, tako da git ne provjerava status velikih nadziranih datoteka. Pogledajte solopackaging.ru.site/questions/1817 / ... za više informacija ...

 git update-index --skip-worktree <file> 
830
27 нояб. odgovor je dan Konstantin 27. studenog. 2013-11-27 14:24 '13 u 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

Ovo uzima popis ignoriranih datoteka i uklanja ih iz indeksa, a zatim izvršava promjene.

237
24 мая '14 в 1:29 2014-05-24 01:29 Odgovor je dan thSoft 24. svibnja '14 u 1:29 2014-05-24 01:29

Tu naredbu uvijek koristim za brisanje tih datoteka koje se ne mogu reproducirati. Izlaz u jednom redu, Unix stilu, čist:

 git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

Popisuje sve vaše ignorirane datoteke, zamjenjuje ih redom s navodnicima umjesto svake linije izlaza za obradu putova s ​​razmacima unutar i prosljeđuje sve git rm -r --cached za uklanjanje staza / datoteka / direktorija iz indeksa.

62
19 июня '15 в 18:42 2015-06-19 18:42 Odgovor je dao David Hernandez 19. lipnja 2009. u 18:42 sati 2015-06-19 18:42

Ako ne možete git rm pratiti datoteku, jer drugi ljudi svibanj potreba (upozorenje, čak i ako pritisnete git rm --cached kada netko drugi primi ovu promjenu, njegove datoteke će biti izbrisani u njihovom datotečnom sustavu). To se često događa zbog poništavanja konfiguracijske datoteke, vjerodajnica za provjeru autentičnosti itd. Molimo pogledajte https://gist.github.com/1423106 za načine na koje su ljudi zaobišli problem.

Da sumiramo:

  • Zatražite od svoje aplikacije da pronađe nestalu datoteku config-overide.ini i da je koristi u zarobljenoj datoteci config.ini (ili, alternativno, pronađite ~ / .config / myapp.ini ili $ MYCONFIGFILE)
  • Popravite datoteku config-sample.ini i zanemarite datoteku config.ini, ako je potrebno, stvorite skriptu ili sličnu datoteku za kopiranje.
  • Pokušajte s gitattributes clean / smudge magic primijeniti i ukloniti promjene, primjerice zamagliti konfiguracijsku datoteku kao izvadak iz alternativne grane i očistiti konfiguracijsku datoteku kao izvadak iz HEAD. To je teška stvar, ne preporučujem je za početnike.
  • Spremite konfiguracijsku datoteku u njezin ogranak posvećenoj implementaciji, koji se nikada neće spojiti s glavnim. Kada želite implementirati / prevesti / testirati, spojite se s ovom granom i nabavite ovu datoteku. U suštini, ovo je pristup razmazivanja / čišćenja, s iznimkom korištenja pravila spajanja ljudi i dodatnih git modula.
  • Anti-recommender: nemojte koristiti pretpostavke bez promjena, završit će se samo suzama (jer lažna laž sama po sebi može dovesti do loših stvari, kao što su vaše promjene zauvijek izgubljene).
53
19 июля '12 в 3:08 2012-07-19 03:08 Odgovor je dao Seth Robertson na Srpanj 19 '12 u 3:08 2012-07-19 03:08

premjestite ga, zaključajte i vratite. Radio je za mene u prošlosti. Vjerojatno postoji način da to napravi gittier.

51
13 авг. Odgovor dao Joel Hooks Aug 13 2009-08-13 22:27 '09 u 22:27 sati 2009-08-13 22:27

Koristite ovo kada:

1. Želite formatirati mnogo datoteka ili

2. Ažurirali ste datoteku gitignore

Izvorna veza: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Pretpostavimo da ste već dodali / prenijeli neke datoteke u vaše git repozitorij, a zatim ih dodali u vaš.gitignore; te će datoteke i dalje biti prisutne u indeksu spremišta. U ovom članku vidjet ćemo kako ih se riješiti.

1. korak: Obavite sve promjene.

Prije nastavka provjerite jesu li sve promjene izvršene, uključujući datoteku .gitignore.

Korak 2. Uklonite sve iz spremišta.

Da biste izbrisali repo, upotrijebite:

 git rm -r --cached . 
  • rm - naredba brisanja
  • -r će omogućiti rekurzivno brisanje
  • -Cached će ukloniti samo datoteke iz indeksa. Vaše će datoteke i dalje biti tu.

Naredba rm može biti neumoljiva. Ako želite probati što radi unaprijed, dodajte -n ili --dry-run da biste provjerili sve.

Korak 3: Dodaj sve

 git add . 

Korak 4: Popravite

 git commit -m ".gitignore fix" 

Vaše spremište je čisto :)

Kliknite na promjene na daljinskom upravljaču da biste vidjeli promjene koje su na snazi.

40
22 апр. Odgovor dao Dheeraj Bhaskar 22. travnja 2018-04-22 21:11 '18 u 21:11 2018-04-22 21:11

Što mi nije uspjelo

(Na Linuxu) Htio sam koristiti poruke koje sugeriraju da je pristup ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Međutim, (neke od) datoteka koje treba izbrisati imale su znakove newline / LF / \n Nijedno od rješenja:

 git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

riješiti ovu situaciju (dobiti pogreške o datotekama nisu pronađene).

Stoga predlažem

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 

Ona koristi -z argument za ls-datoteke , a -0 argument koristi xargs za sigurno / ispravno korištenje za "gadne" znakove u nazivima datoteka.

Priručna stranica git-ws-files (1) navodi:

Ako se ne koristi opcija -z, znakovi TAB, LF i obrnute kose crte u putanjama su predstavljeni kao, n, i \ t

tako da mislim da je moje rješenje potrebno ako imena datoteka sadrže bilo koji od ovih znakova.

EDIT: Zamoljen sam da dodam - poput bilo koje git rm naredbe - mora biti popraćeno obvezom da bi se, na primjer, trajno uklonilo. git commit -am "Remove ignored files" .

38
29 дек. Odgovor je dao JonBrave 29. prosinca. 2015-12-29 15:50 '16 u 15:50 2015-12-29 15:50

Učinio sam to pomoću git grana filtera . Točna naredba koju sam upotrijebio preuzeta je s man stranice:

UPOZORENJE : ovo će izbrisati datoteku iz cijele povijesti.

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Ova naredba osvježava cijelu povijest git rm pokretanjem git rm prije svakog urezivanja i time raspolaže navedenom datotekom. Ne zaboravite izvršiti sigurnosnu kopiju prije pokretanja naredbe, jer će biti izgubljena.

35
13 авг. odgovor je dat drllvn 13 aug. 2009-08-13 22:35 09. 09. u 10:35 2009-08-13 22:35
  • Ažurirajte .gitignore datoteku - na primjer, dodajte mapu u koju ne želite pratiti .gitignore .

  • git rm -r --cached . - brisanje svih datoteka koje se prate, uključujući neželjene i neželjene. Vaš će kôd biti siguran ako ste ga spremili lokalno.

  • git add . - Sve će se datoteke vratiti, osim onih koje su navedene u .gitignore .


Savjet @AkiraYamamoto kape pokazuju u pravom smjeru.

18
04 апр. odgovor je dan Chen_Wayne 04 apr. 2016-04-04 07:09 '16 u 7:09 2016-04-04 07:09

Mislim da možda git ne može u potpunosti zaboraviti datoteku zbog svog koncepta ( odjeljak "Slike, a ne razlike" ).

Taj problem nedostaje, na primjer, kada se koristi CVS. CVS pohranjuje informacije kao popis promjena koje se temelje na datotekama. Informacije za CVS je zbirka datoteka i izmjena svake datoteke tijekom vremena.

No, u git-u, svaki put kada objavite ili spremite stanje vašeg projekta, on u osnovi uzima sliku o tome kako sve vaše datoteke trenutno izgledaju i sprema vezu na tu snimku, pa ako ste jednom dodali datoteku, uvijek je će biti prisutan na ovom snimku.

Ova 2 članka su mi pomogla:

git take-no change vs skip-worktree i Kako ignorirati promjene u praćenim datotekama pomoću git-a

Na temelju toga radim sljedeće ako je datoteka već praćena:

 git update-index --skip-worktree <file> 

Od tog trenutka sve lokalne promjene u ovoj datoteci bit će zanemarene i neće biti izbrisane. Ako se datoteka promijeni u udaljenu, dolazi do sukoba kada git pull . Stop neće raditi. Da biste riješili problem, kopirajte sadržaj datoteke na sigurno mjesto i slijedite ove korake:

 git update-index --no-skip-worktree <file> git stash git pull 

Sadržaj datoteke bit će zamijenjen izbrisanim sadržajem. Zalijepite promjene s sigurnog mjesta u datoteku i pokrenite ponovo:

 git update-index --skip-worktree <file> 

Ako svatko tko radi s projektom pokrene git update-index --skip-worktree <file> , ne bi trebalo biti problema s pull . Ovo rješenje je prikladno za konfiguracijske datoteke kada svaki programer ima svoju konfiguraciju projekta.

To nije baš pogodno za svaki put kad se datoteka promijeni na udaljenom računalu, ali može je zaštititi od prebrisanja udaljenog sadržaja.

12
21 мая '17 в 18:12 2017-05-21 18:12 odgovor je dat Boolean_Type 21. svibnja '17 u 6:12 2017-05-05 18:12

Kopiranje / lijepljenje Odgovor: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Ova će naredba ignorirati datoteke koje su već prenesene u spremište Git, ali sada smo ih dodali u .gitignore .

5
19 нояб. Odgovor je dao youhans 19. studenog 2018-11-19 14:21 '18 u 2:21 pm 2018-11-19 14:21

Odgovor Matta Feara bio je najučinkovitiji IMHO. Slijedi samo PowerShell skripta za one koji na Windows samo brišu datoteke iz svog git repozitorija, što odgovara njihovom popisu izuzetaka.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. Odgovor daje Ameer Deen 25. prosinca. 2013-12-25 03:51 '13 u 3:51 2013-12-25 03:51

Premjestite ili kopirajte datoteku na sigurno mjesto tako da je ne izgubite. Zatim git rm datoteku i urezivanje. Datoteka će se prikazati ako se vratite na jednu od ovih prethodno izvršenih obveza ili na drugu granu u kojoj nije izbrisana. Međutim, u svim budućim objavljivanjima nećete ponovno vidjeti datoteku. Ako je datoteka u git-u za ignoriranje, možete je premjestiti natrag u mapu, a git je neće vidjeti.

5
13 авг. Odgovor dao Apreche 13. kolovoza 2009-08-13 22:27 '09 u 22:27 sati 2009-08-13 22:27

Izvedite sljedeće korake naizmjenično, sve će biti u redu.

1. Brisanje pogrešno dodanih datoteka iz direktorija / spremišta . Možete koristiti naredbu "rm -r" (za linux) ili ih obrisati pregledavanjem direktorija.

2.add datoteke / direktorije u datoteci gitignore i spremite je.

3. Sada ih izbrišite iz git cachea pomoću ovih naredbi (ako ih ima nekoliko, izbrišite ih jednu po jednu, ponovno izdavanjem ove naredbe)

 git rm -r --cached path-to-those-files 

4. Sada potvrdite i pritisnite , koristite ove naredbe. To će ukloniti te datoteke s udaljenog git-a i uzrokovati da git prestane pratiti te datoteke.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. Odgovor daje Shamsul Arefin Sajib 20. rujna. 2018-09-20 13:52 '18 u 13:52 sati 2018-09-20 13:52

BFG je posebno dizajniran za uklanjanje neželjenih podataka, kao što su velike datoteke ili lozinke iz spremišta Git, tako da ima jednostavnu zastavu koja će ukloniti sve velike povijesne datoteke (ne u vašoj trenutnoj): "-strip-blobs-more-than"

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Ako želite odrediti datoteke prema nazivu, to možete i učiniti:

 $ java -jar bfg.jar --delete-files *.mp4 

BFG je 10-1000x brži od git filtera i obično je mnogo lakši za korištenje - pogledajte upute za punu upotrebu i primjere za više detalja.

Izvor: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Odgovor Meir Gerenstadt 03 ruj. 2017-09-03 15:37 '17 u 15:37 2017-09-03 15:37

Sviđa mi se odgovor od JonBrave, ali imam prilično prljavih radnih imenika koji popravljaju -a, malo me plaše, tako da sam to učinio:

git config --global alias.exclude-ignored '! git ls-files -z --zabilježen --exclude-standard | xargs -0 git rm -r --cached git ls-datoteke -z --zabilježen --exclude-standard | xargs -0 git stage git stage.gitignore git commit -m "novo gitignore i ukloni ignorirane datoteke iz indeksa"

uništenje:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • uklonite zanemarene datoteke iz indeksa
  • Stage.gitignore i datoteke koje ste upravo izbrisali.
  • za počinjenje
2
08 авг. odgovor je dao Jay Irvine 08 aug. 2018-08-08 23:49 '18 u 23:49 2018-08-08 23:49

Ako ne želite koristiti CLI i raditi sa sustavom Windows, vrlo jednostavno rješenje je koristiti TortoiseGit , on ima akciju "Izbriši (spremi lokalno)" u izborniku, koja radi dobro.

2
15 марта '18 в 14:04 2018-03-15 14:04 Odgovor daje Pedi T. 15. ožujka '18 u 14:04 sati 2018-03-15 14:04

To više nije problem u najnovijem git-u (v2.17.1 u vrijeme pisanja).

U .gitignore zanemaruje praćene datoteke, ali se briše. Možete to sami provjeriti pokretanjem sljedeće skripte. Konačni izraz git status treba reći "ne raditi ništa".

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 odgovor je dao Lloyd 13. lipnja 18 u 19:21

U slučaju već izvršenog DS_Store :

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Zanemari ih:

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Konačno, popravite!

0
23 апр. odgovor daje korisnik7718859 23 travnja. 2018-04-23 00:14 '18 u 0:14 2018-04-23 00:14

Na Mac računalu:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Izbrišite datoteke DS_Store s popisa datoteka koje prate git u foo branši:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Urezivanje:

 $ git commit -m "Removed .DS_Store files" 

3. Provjerite da se datoteke više ne prate.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Kliknite da biste ih uklonili iz konzole:

 $ git push 
-5
13 янв. Odgovor dao Raphvanns 13. siječnja 2017-01-13 22:53 '17 u 10:53 2017-01-13 22:53

Ostala pitanja o oznakama ili Postavite pitanje