Kaip padaryti, kad „Git“ „pamiršti“ apie failą, kuris buvo stebimas, bet dabar yra .gitignore?

Yra failas, kurį stebi git , bet dabar failas yra .gitignore sąraše.

Tačiau šis failas toliau rodomas git status po to, kai jį redaguojate. Kaip git visiškai užmiršti?

4082
13 авг. nustatyti Ivanas 13 rug. 2009-08-13 22:23 '09 at 10:23 AM 2009-08-13 22:23
@ 22 atsakymai

.gitignore neleis nepažeistiems failams pridėti (be add -f ) failų rinkinio, kurį stebi „git“, bet git ir toliau stebės visus jau sekančius failus.

Jei norite sustabdyti failo stebėjimą, turite jį pašalinti iš indekso. Tai galima pasiekti naudojant šią komandą.

 git rm --cached <file> 

Failo ištrynimas iš redagavimo antraštės įvyksta kitame įvykyje.

PASTABA: Nors tai nepašalins fizinio failo iš vietinio failo, jis ištrins failus iš kitų kūrėjų mašinų su kita git pull .

4329
13 авг. CB Bailey atsakymas rugpjūčio 13 d 2009-08-13 23:40 '09, 11:40 pm 2009-08-13 23:40

Toliau pateiktų komandų sekoje visi elementai iš „Git“ indekso bus ištrinti (ne iš darbo katalogo ar vietinio repo), o tada „Git“ indeksas bus atnaujintas, o „Git“ bus ignoruojamas. Ps. Indeksas = talpykla

Pirma:

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

Tada:

 git commit -am "Remove ignored files" 
2209
30 сент. Atsakymą pateikė Matt Frear 30 sep . 2013-09-30 16:51 '13, 16:51, 2013-09-30 16:51

„git update-index“ atlieka visą darbą man:

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

Pastaba Šis sprendimas yra beveik nepriklausomas nuo .gitignore nes gitignore yra skirtas tik nepažymėtiems failams.

pakeisti: nuo šio atsakymo paskelbimo buvo sukurta nauja galimybė, o tai turėtų būti teikiama pirmenybė. Turėtumėte naudoti --skip-worktree kuris yra skirtas modifikuotiems --skip-worktree failams, kuriuos vartotojas nebenori taisyti, ir taupo --assume-unchanged - sutaupyti didesnio našumo, todėl git nekontroliuoja didelių stebimų failų būsenos. Daugiau informacijos žr. ngn-wiki.ru.site/questions/1817 / ...

 git update-index --skip-worktree <file> 
830
27 нояб. atsakymas pateikiamas Konstantino lapkričio 27 d. 2013-11-27 14:24 '13, 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" 

Tai užtrunka ignoruojamų failų sąrašą ir pašalina juos iš indekso, o tada atlieka pakeitimus.

237
24 мая '14 в 1:29 2014-05-24 01:29 Atsakymas pateikiamas „ Gegužės 24 d., 14 d. 1:29 2014-05-24 01:29

Visada naudoju šią komandą, kad ištrintumėte šiuos nepavykusius failus. Vienos eilutės, Unix stiliaus, švarios išvesties:

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

Jame išvardijami visi jūsų ignoruojami failai, pakeičiami git rm -r --cached su kabutėmis vietoj kiekvienos išvesties eilutės, kad būtų apdoroti keliai, kuriuose yra tarpų, ir perduoti viską, kad git rm -r --cached kad pašalintumėte kelius / failus / katalogus iš indekso.

62
19 июня '15 в 18:42 2015-06-19 18:42 Atsakymą davė Davidas Hernandezas birželio 19 d. 15 val. 18.42 val. 2015-06-19 18:42

Jei negalite git rm stebimo failo, nes tam gali prireikti kitų žmonių (įspėjimas, net jei paspaudžiate git rm --cached kai kas nors gauna šį pakeitimą, jo failai bus ištrinti failų sistemoje). Dažnai tai daroma dėl konfigūracijos failo, autentiškumo patvirtinimo ir pan. Žiūrėkite https://gist.github.com/1423106, kaip žmonės apeina problemą.

Apibendrinant:

  • Paprašykite savo programos surasti trūkstamą config-overide.ini failą ir naudoti jį per užfiksuotą config.ini failą (arba, alternatyviai, raskite ~ / .config / myapp.ini arba $ MYCONFIGFILE)
  • Nustatykite config-sample.ini failą ir, jei reikia, ignoruokite config.ini failą, sukurkite scenarijų arba panašų failą, kurį norite kopijuoti.
  • Pabandykite naudoti „gitattributes“ švarią / tepalinę magiją, kad pritaikytumėte ir pašalintumėte pakeitimus, pvz., Neryškinkite konfigūracijos failą kaip alternatyvos šakos ištrauką ir išvalykite konfigūracijos failą kaip HEAD ištrauką. Tai yra sudėtingas dalykas, aš nerekomenduoju naujokui.
  • Išsaugokite konfigūracijos rinkmeną savo specialioje diegimo šakoje, kuri niekada nebus sujungta su pagrindiniu. Jei norite įdiegti / kompiliuoti / išbandyti, sujungiate su šiuo filialu ir gaukite šį failą. Iš esmės tai yra tamsus / švarus požiūris, išskyrus žmonių sujungimo politiką ir papildomus git modulius.
  • Anti-rekomendatorius: nenaudokite prielaidų be pakeitimų, jis baigsis tik ašaromis (nes netikras melas gali sukelti blogus dalykus, pvz., Jūsų pakeitimai bus prarasti amžinai).
53
19 июля '12 в 3:08 2012-07-19 03:08 Atsakymą pateikė Seth Robertson , liepos 19 d. 12 d., 03:08 2012-07-19 03:08

perkelkite, užrakinkite ir grąžinkite. Jis praeityje dirbo man. Gittieriui tai yra būdas tai padaryti.

51
13 авг. Joel Hooks atsakymas rugpjūčio 13 d 2009-08-13 22:27 '09 22:27 pm 2009-08-13 22:27

Naudokite tai, kai:

1. Norite formatuoti daug failų arba

2. Atnaujinote savo gitignore failą

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

Tarkime, jūs jau pridėjote / perkėlėte kai kuriuos failus į savo git saugyklą ir tada pridėjote juos prie your.gitignore; šie failai vis tiek bus saugomi jūsų saugyklos indekse. Šiame straipsnyje pamatysime, kaip atsikratyti jų.

1 žingsnis: įsipareigokite atlikti visus pakeitimus.

Prieš tęsdami įsitikinkite, kad visi įvykdyti pakeitimai, įskaitant .gitignore failą.

2 žingsnis. Pašalinkite viską iš saugyklos.

Jei norite ištrinti repo, naudokite:

 git rm -r --cached . 
  • rm - ištrinti komandą
  • -r leis rekursinį ištrynimą
  • -Paštas pašalins failus tik iš indekso. Jūsų failai vis dar bus.

rm komanda gali būti netinkama. Jei norite išbandyti tai, ką daro iš anksto, pridėkite -n arba --dry-run kad patikrintumėte viską.

3 veiksmas: pridėkite viską

 git add . 

4 žingsnis

 git commit -m ".gitignore fix" 

Jūsų saugykla yra švari :)

Paspauskite ant nuotolinio valdymo pulto esančius pakeitimus, kad pamatytumėte pokyčius, kurie taip pat yra veiksmingi.

40
22 апр. Dheeraj Bhaskar atsakymas, pateiktas balandžio 22 d 2018-04-22 21:11 '18, 9:11 pm 2018-04-22 21:11

Kas man neveikė

(„Linux“) Norėjau naudoti pranešimus, kurie rodo „ ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Tačiau (kai kurie iš) failai, kuriuos reikia ištrinti, turėjo įterpti į jų vardus Nė vienas iš sprendimų:

 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 

susidoroti su šia situacija (gausite klaidų dėl failų nerastų).

Todėl siūlau

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

Jis naudoja -z argumentą ls-failams , o -0 argumentas naudoja xargs saugiai / teisingai naudoti „bjaurus“ simbolius failų pavadinimuose.

Git-ws-files“ (1) vadovas nurodo:

Jei „-z“ parinktis nenaudojama, „TAB“, „LF“ ir „backslash“ ženklai, esantys „pathnames“, yra atitinkamai pavardės „n“ ir „“.

todėl manau, kad mano sprendimas yra būtinas, jei failų pavadinimuose yra bet kuris iš šių simbolių.

EDIT: Man buvo paprašyta pridėti, kad --- kaip ir bet kokia git rm komanda - tai turi būti laikomasi įsipareigojus , kad pašalinimas būtų nuolatinis, pvz. git commit -am "Remove ignored files" .

38
29 дек. Atsakymą davė JonBrave gruodžio 29 d. 2015-12-29 15:50 '16 at 15:50 2015-12-29 15:50

Tai padariau naudodamas filtro git šaką . Tiksli komanda, kurią naudoju, buvo paimta iš žmogaus puslapio:

ĮSPĖJIMAS : tai pašalins failą iš visos istorijos.

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

Ši komanda atkuria visą įvykių istoriją, prieš paleisdama „ git rm ir taip pašalina nurodytą failą. Prieš paleisdami komandą, nepamirškite atlikti atsarginės kopijos, nes ji bus prarasta.

35
13 авг. atsakymas duotas drrlvn 13 rug . 2009-08-13 22:35 '09, 10:35 AM 2009-08-13 22:35
  • Atnaujinkite .gitignore failą - pvz., Pridėkite aplanką, į kurį nenorite sekti .gitignore .

  • git rm -r --cached . - ištrinti visus stebimus failus, įskaitant nepageidaujamą ir nepageidaujamą. Jūsų kodas bus saugus, jei jį išsaugosite vietoje.

  • git add . - Visi failai bus pridėti atgal, išskyrus tuos, kurie nurodyti .gitignore .


Patarimas @AkiraYamamoto skrybėlės nurodo tinkamą kryptį.

18
04 апр. atsakymas pateikiamas Chen_Wayne 04 balandžio. 2016-04-04 07:09 '16 at 7:09 2016-04-04 07:09

Manau, kad galbūt git negali visiškai pamiršti bylos dėl savo sąvokos ( skilties „Vaizdai, o ne skirtumas“ ).

Ši problema nėra, pavyzdžiui, naudojant CVS. CVS saugo informaciją kaip failų keitimo sąrašą. CVS informacija yra failų rinkinys ir pakeitimai, padaryti kiekviename faile per tam tikrą laiką.

Bet git, kiekvieną kartą, kai įsipareigojate arba išsaugosite savo projekto būseną, ji iš esmės fotografuoja, ką visi jūsų failai atrodo šiuo metu, ir išsaugo nuorodą į šį momentinį vaizdą. Taigi, jei pridėjote failą vieną kartą, jis visada yra bus pateikta šiame momentiniame vaizde.

Šie 2 straipsniai man buvo naudingi:

„git“ prisiimti-ne keisti prieš skip-worktree ir kaip ignoruoti stebimų failų pakeitimus naudojant „git“

Atsižvelgdamas į tai, jei failas jau stebimas:

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

Nuo šio momento visi vietiniai šio failo pakeitimai bus ignoruojami ir nebus ištrinti. Jei failas pakeistas į nuotolinį, atsiranda konfliktas, kai bus git pull . „Stop“ neveiks. Norėdami išspręsti problemą, nukopijuokite failo turinį į saugią vietą ir atlikite šiuos veiksmus:

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

Failo turinys bus pakeistas ištrintu turiniu. Įklijuokite pakeitimus iš saugios vietos į failą ir paleiskite dar kartą:

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

Jei kiekvienas, kuris dirba su projektu, vykdo „ git update-index --skip-worktree <file> , neturėtų būti jokių problemų, susijusių su pull . Šis sprendimas tinka konfigūracijos failams, kai kiekvienas kūrėjas turi savo projekto konfigūraciją.

Tai nėra labai patogu atlikti kiekvieną kartą, kai failas buvo pakeistas nuotoliniame kompiuteryje, tačiau jis gali apsaugoti jį nuo perrašymo nuotoliniu turiniu.

12
21 мая '17 в 18:12 2017-05-21 18:12 atsakymas pateikiamas Boolean_Type, gegužės 21 d., 17 val

Kopijuoti / įklijuoti atsakymą: 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

Ši komanda ignoruos failus, kurie jau buvo perkelti į „Git“ saugyklą, bet dabar juos .gitignore į .gitignore .

5
19 нояб. Atsakymą pateikė jūs, 19 d 2018-11-19 14:21 '18, 14:21 val. 2018-11-19 14:21

Matt Fear atsakymas buvo efektyviausias IMHO. Toliau pateikiamas tik „PowerShell“ scenarijus tiems, kurie tik „Windows“ sistemoje ištrina failus iš savo git saugyklos, kuri atitinka jų išimčių sąrašą.

 # 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 дек. Atsakymą pateikė Amer Deen . 2013-12-25 03:51 '13, 3:51, 2013-12-25 03:51

Perkelkite arba nukopijuokite failą į saugią vietą, kad neprarastumėte. Tada git rm failą ir įsipareigokite. Failas bus rodomas, jei grįšite prie vieno iš šių anksčiau padarytų įsipareigojimų, arba į kitą skyrių, kuriame jis nebuvo ištrintas. Tačiau visais ateities dokumentais failas nematys. Jei failas yra ignoruojamas, galite jį perkelti į aplanką, o git jo nepamatys.

5
13 авг. Atsakymas, kurį pateikė Apreche Aug 13 2009-08-13 22:27 '09 22:27 pm 2009-08-13 22:27

Pakaitomis atlikite šiuos veiksmus: viskas bus gerai.

1. Ištrinkite klaidingai pridėtus failus iš katalogo / saugyklos . Galite naudoti komandą „rm -r“ (linux) arba ištrinti juos naršydami katalogus.

2.add failus / katalogus į gitignore failą ir išsaugokite.

3. Ištrinkite juos iš „ git“ talpyklos naudodami šias komandas (jei yra keletas katalogų, ištrinkite juos po vieną, iš naujo išleiskite šią komandą)

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

4. Dabar įsipareigokite ir paspauskite , naudokite šias komandas. Tai pašalins šiuos failus iš nuotolinio „git“ ir sukels „git“ sustabdyti šių failų stebėjimą.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. Atsakymą pateikė Shamsul Arefin Sajib . 2018-09-20 13:52 '18, 13:52 pm 2018-09-20 13:52

BFG yra specialiai sukurtas pašalinti nepageidaujamus duomenis, pvz., Didelius failus ar slaptažodžius iš „Git“ saugyklų, todėl turi paprastą vėliavą, kuri pašalins visus didelius istorinius failus (ne jūsų dabartinėje): „-strip-blobs-more-than“

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

Jei norite nurodyti failus pagal pavadinimą, galite tai padaryti:

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

BFG yra 10–1000 kartų greitesnis už „Git“ filtravimo šaką ir paprastai yra daug lengviau naudoti - išsamesnės informacijos ieškokite visiško naudojimo instrukcijose.

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

3
03 сент. Atsakymas, kurį pateikė Meir Gerenstadt 03 rugsėjo. 2017-09-03 15:37 '17, 15:37 pm 2017-09-03 15:37

Man patiko „JonBrave“ atsakymas, bet turiu gana nešvarius darbo katalogus, kurie išsprendžia -a, jis šiek tiek bijo mane, todėl aš tai padariau:

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r - cached git ls-files -z -ignored - išskirtinis standartas | xargs -0 git etapas git stage.gitignore git įsipareigoja -m "naujas gitignore ir pašalinti ignoruojamus failus iš indekso"

sunaikinimas:

 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" 
  • pašalinti nepaisytus failus iš indekso
  • Stage.gitignore ir tiesiog ištrinti failai.
  • įsipareigoti
2
08 авг. atsakymą pateikė Jay Irvine 08 rug. 2018-08-08 23:49 '18 at 11:49 PM 2018-08-08 23:49

Jei nenorite naudoti „CLI“ ir dirbti su „Windows“, labai paprastas sprendimas yra naudoti „ TortoiseGit“ , jis turi veiksmą „Ištrinti (išsaugoti vietos)“ meniu, kuris veikia gerai.

2
15 марта '18 в 14:04 2018-03-15 14:04 Atsakymą pateikė Pedi T. Kovo 15 d., 18 val. 14:04 val. 2018-03-15 14:04

Tai nėra problema naujausiame git (v2.17.1 rašymo metu).

.gitignore ignoruoja .gitignore failus, bet ištrina. Tai galite patikrinti patys naudodami šį scenarijų. Galutinė „ git status išraiška turėtų pasakyti „nieko nedaryti“.

 # 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 „ Lloyd“ atsakymą pateikė birželio 13 d. 18 val. 19:21 val. 2018-06-13 19:21

Jei jau DS_Store :

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

Nepaisykite jų:

 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 

Galiausiai, sureguliuokite!

0
23 апр. atsakymą pateikė vartotojo7718859 23 balandis. 2018-04-23 00:14 '18 prie 0:14 2018-04-23 00:14

„Mac“:

 $ 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. Ištrinkite „DS_Store“ failus iš failų, stebimų „goo“, sąraše foo filiale:

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

2. Įsipareigojimas:

 $ git commit -m "Removed .DS_Store files" 

3. Patikrinkite, ar failai nebėra stebimi.

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

4. Spustelėkite, jei norite pašalinti juos iš konsolės:

 $ git push 
-5
13 янв. Atsakymas, kurį pateikė Raphvanns Jan 13 2017-01-13 22:53 '17 10:53 2017-01-13 22:53

Kiti klausimai apie žymes arba Užduoti klausimą