border=0

Hoe maak ik Git "vergeten" over een bestand dat werd gevolgd, maar is het nu in .gitignore?

Er is een bestand dat wordt bijgehouden door git , maar nu staat het bestand in de .gitignore lijst.

Dit bestand wordt echter nog steeds in git status nadat het is bewerkt. Hoe maak je het helemaal vergeten?

4269
13 авг. Ivan startte op 13 augustus 2009-08-13 22:23 '09 om 10:23 uur 2009-08-13 22:23
@ 23 antwoorden

.gitignore voorkomen dat niet-volgde bestanden worden toegevoegd (zonder add -f ) aan de set van bestanden die worden bijgehouden door git, maar git zal doorgaan met het volgen van bestanden die al worden bijgehouden.

Als u het traceren van een bestand wilt stoppen, moet u het uit de index verwijderen. Dit kan worden bereikt met deze opdracht.

 git rm --cached <file> 

Het verwijderen van een bestand uit de revisiekop zal plaatsvinden bij de volgende commit.

OPGELET: Hoewel het fysieke bestand niet van uw lokale bestand wordt verwijderd, zal het bestanden van de machines van andere ontwikkelaars verwijderen met de volgende git pull .

4517
13 авг. Antwoord gegeven door CB Bailey 13 aug. 2009-08-13 23:40 '09 om 23:40, 2009-08-13 23:40

In de onderstaande volgorde van opdrachten worden alle items uit de Git-index verwijderd (niet uit de werkmap of lokale repository) en dan wordt de Git-index bijgewerkt, terwijl Git wordt genegeerd. PS. Index = Cache

Ten eerste:

 git rm -r --cached . git add . 

vervolgens:

 git commit -am "Remove ignored files" 
2278
30 сент. Het antwoord wordt gegeven door Matt Frear 30 september . 2013-09-30 16:51 '13 om 16:51 2013-09-30 16:51

git update-index doet al het werk voor mij:

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

Let op. Deze oplossing is vrijwel onafhankelijk van .gitignore omdat gitignore alleen bedoeld is voor niet-gerangschikte bestanden.

wijziging: sinds dit antwoord is gepubliceerd, is een nieuwe optie gemaakt en dit verdient de voorkeur. Gebruik --skip-worktree die bedoeld is voor gemodificeerde gecontroleerde bestanden die de gebruiker niet meer wil repareren, en bewaart --assume-unchanged voor betere prestaties, zodat git niet de status van grote bewaakte bestanden controleert. Zie xbad.info.site/questions/1817 / ... voor meer informatie ...

 git update-index --skip-worktree <file> 
882
27 нояб. het antwoord wordt gegeven Konstantin 27 november. 2013-11-27 14:24 '13 om 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" 

Dit neemt een lijst met genegeerde bestanden op en verwijdert ze uit de index en voert vervolgens de wijzigingen door.

245
24 мая '14 в 1:29 2014-05-24 01:29 Het antwoord wordt op 24 mei '14 gegeven op 1:29 2014-05-24 01:29

Ik gebruik altijd deze opdracht om deze niet-afspeelbare bestanden te verwijderen. Single-line, Unix-stijl, zuivere output:

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

Het geeft een overzicht van alle genegeerde bestanden, vervangen door een regel met aanhalingstekens in plaats van elke regel van uitvoer naar procespaden met spaties erin en geeft alles door aan git rm -r --cached om paden / bestanden / mappen uit de index te verwijderen.

67
19 июня '15 в 18:42 2015-06-19 18:42 Antwoord werd gegeven door David Hernandez op 19.15.15 uur om 18:42 uur 2015-06-19 18:42

Als je git rm bewaakte bestand niet kunt git rm --cached omdat andere mensen het misschien nodig hebben (een waarschuwing, zelfs als je op git rm --cached wanneer iemand anders deze wijziging ontvangt, worden zijn bestanden in hun bestandssysteem verwijderd). Dit wordt vaak gedaan vanwege het overschrijven van het configuratiebestand, authenticatiereferenties enzovoort. Kijk op https://gist.github.com/1423106 voor manieren waarop mensen het probleem omzeild hebben.

Samenvattend:

  • Vraag je applicatie om het ontbrekende config-overide.ini bestand te vinden en het te gebruiken over het vaste config.ini bestand (of, als alternatief, vind je ~ / .config / myapp.ini of $ MYCONFIGFILE)
  • Los het config-sample.ini-bestand op en negeer het config.ini-bestand, maak zo nodig een script of een vergelijkbaar bestand om te kopiëren.
  • Probeer de gitattributes clean / smudge magic te gebruiken om wijzigingen toe te passen en te verwijderen, bijvoorbeeld het configuratiebestand vervagen als een uittreksel uit een alternatieve vertakking en het configuratiebestand wissen als een uittreksel uit HEAD. Dit is een gecompliceerde zaak, ik raad het niet aan voor een beginnende gebruiker.
  • Sla het configuratiebestand op in zijn speciale implementatietak, die nooit zal worden samengevoegd met de master. Wanneer u wilt deployen / compileren / testen, dan fuseert u met deze branch en krijgt u dit bestand. In wezen is dit de vegen / schone aanpak, met uitzondering van het gebruik van mensen samenvoegbeleid en extra git-modules.
  • Anti-recommender: gebruik geen aannames zonder veranderingen, het eindigt alleen met tranen (omdat een valse leugen op zichzelf tot slechte dingen kan leiden, zoals uw wijzigingen voor altijd verloren zullen gaan).
53
19 июля '12 в 3:08 2012-07-19 03:08 Antwoord wordt gegeven door Seth Robertson op 19 juli '12 op 3:08 2012-07-19 03:08

verplaats het, vergrendel het en breng het dan terug. Het werkte in het verleden voor mij. Er is waarschijnlijk een manier voor "gittier" om dit te doen.

50
13 авг. Antwoord gegeven door Joel Hooks 13 augustus 2009-08-13 22:27 '09 om 10:27 uur 2009-08-13 22:27

Gebruik dit wanneer:

1. U wilt een groot aantal bestanden formatteren of

2. U hebt uw gitignore-bestand bijgewerkt

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

Stel dat je al wat bestanden hebt toegevoegd / overgedragen aan je git-repository en ze vervolgens hebt toegevoegd aan je.gitignore; deze bestanden zullen nog steeds aanwezig zijn in uw repository-index. In dit artikel zullen we zien hoe we van ze af kunnen komen.

Stap 1: Voer al uw wijzigingen uit

Voordat u doorgaat, moet u ervoor zorgen dat al uw wijzigingen zijn doorgevoerd, inclusief het .gitignore-bestand.

Stap 2. Verwijder alles uit de repository.

Om uw repo te wissen, gebruikt u:

 git rm -r --cached . 
  • rm - verwijder opdracht
  • -r zal recursieve verwijdering toelaten
  • -Cached zal alleen bestanden uit de index verwijderen. Je bestanden zullen er nog steeds zijn.

Het commando rm kan onverbiddelijk zijn. Als je wilt proberen wat het doet, voeg dan -n of --dry-run toe om alles te controleren.

Stap 3: Alles toevoegen

 git add . 

Stap 4: Fix

 git commit -m ".gitignore fix" 

Je repository is schoon :)

Klik op de wijzigingen op de afstandsbediening om de wijzigingen te bekijken die daar ook effectief zijn.

46
22 апр. Antwoord gegeven door Dheeraj Bhaskar 22 april 2018-04-22 21:11 '18 om 21:11 uur 2018-04-22 21:11

Wat werkte niet voor mij

(Onder Linux) wilde ik berichten gebruiken die suggereren dat de ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Echter, (een deel van) de bestanden die verwijderd moesten worden, hadden newline / LF / \n karakters ingebed in hun namen. Geen van de oplossingen:

 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 

omgaan met deze situatie (fouten krijgen over bestanden die niet zijn gevonden).

Daarom stel ik voor

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

Het gebruikt het -z argument voor ls-bestanden en het -0 argument gebruikt xargs om veilig / correct te gebruiken voor "vervelende" tekens in bestandsnamen.

De handmatige pagina met git-ws-bestanden (1) :

Als de optie -z niet wordt gebruikt, worden de tekens TAB, LF en backslash in padnamen respectievelijk als \ t, \ n en \\ gerepresenteerd.

dus ik denk dat mijn oplossing nodig is als de bestandsnamen een van deze karakters bevatten.

EDIT: Ik werd gevraagd om toe te voegen dat --- zoals elke opdracht git rm - het moet worden gevolgd door een commit om de verwijdering permanent te maken, bijvoorbeeld. git commit -am "Remove ignored files" .

38
29 дек. Antwoord wordt gegeven door JonBrave op 29 december. 2015-12-29 15:50 '16 om 15:50 2015-12-29 15:50

Ik deed dit met behulp van de git branch van het filter . De exacte opdracht die ik heb gebruikt, is overgenomen van de manpagina:

WAARSCHUWING : hierdoor wordt het bestand uit de volledige geschiedenis verwijderd.

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

Deze opdracht herschept de volledige commit-geschiedenis door voor elke commit git rm te voeren en heeft dus het gespecificeerde bestand. Vergeet niet om een ​​back-up uit te voeren voordat u de opdracht uitvoert, want deze zal verloren gaan.

36
13 авг. het antwoord wordt gegeven drrlvn 13 aug. 2009-08-13 22:35 '09 om 10:35 uur. 2009-08-13 22:35
  • Werk het .gitignore bestand bij - voeg bijvoorbeeld een map toe waarnaar u .gitignore niet wilt volgen.

  • git rm -r --cached . - verwijder alle bijgehouden bestanden, inclusief ongewenst en ongewenst. Je code is veilig als je hem lokaal hebt opgeslagen.

  • git add . - Alle bestanden worden terug toegevoegd, behalve die gespecificeerd in .gitignore .


Tip hat @ AkiraYamamoto om in de juiste richting te wijzen.

18
04 апр. het antwoord is gegeven Chen_Wayne 04 apr. 2016-04-04 07:09 '16 om 7:09 2016-04-04 07:09

Ik denk dat Git het bestand misschien niet helemaal kan vergeten vanwege zijn concept ( gedeelte "Afbeeldingen, maar niet het verschil" ).

Dit probleem ontbreekt bijvoorbeeld bij het gebruik van CVS. CVS slaat informatie op als een op bestanden gebaseerde lijst met wijzigingen. Informatie voor CVS is een verzameling bestanden en wijzigingen die in de loop van de tijd in elk bestand zijn aangebracht.

Maar git, elke keer als je de staat van je project vastlegt of bewaart, maakt het in feite een foto van hoe al je bestanden er op dit moment uitzien en slaat een link op naar deze snapshot. Dus, als je een bestand een keer hebt toegevoegd, is het altijd zal aanwezig zijn in deze snapshot.

Deze 2 artikelen waren nuttig voor mij:

git neem aan - geen wijzigingen ten opzichte van skip-worktree en Hoe wijzigingen in bijgehouden bestanden te negeren met behulp van git

Op basis hiervan doe ik het volgende als het bestand al is gevolgd:

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

Vanaf dit punt worden alle lokale wijzigingen in dit bestand genegeerd en niet verwijderd. Als het bestand wordt gewijzigd in een bestand op afstand, treedt er een conflict op wanneer git pull . Stop zal niet werken. Om het probleem op te lossen, kopieert u de inhoud van het bestand naar een veilige plaats en volgt u deze stappen:

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

De inhoud van het bestand wordt vervangen door de verwijderde inhoud. Plak uw wijzigingen van een veilige plaats naar het bestand en voer het opnieuw uit:

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

Als iedereen die met het project werkt, git update-index --skip-worktree <file> , zouden er geen problemen met pull . Deze oplossing is geschikt voor configuratiebestanden wanneer elke ontwikkelaar zijn eigen projectconfiguratie heeft.

Dit is niet erg handig om te doen elke keer dat een bestand op een externe computer is gewijzigd, maar het kan het beschermen tegen overschreven door externe inhoud.

13
21 мая '17 в 18:12 2017-05-21 18:12 het antwoord is gegeven Boolean_Type 21 mei, '17 om 6:12 2017-05-05 18:12

Neem afwisselend de volgende stappen, het komt goed.

1. verwijder ten onrechte toegevoegde bestanden uit de directory / repository . U kunt de opdracht "rm -r" (voor linux) gebruiken of ze verwijderen door in de directory's te bladeren. Of verplaats ze naar een andere locatie op uw pc. [Mogelijk moet u de IDE sluiten als u wilt verplaatsen / verwijderen ]

2. Voeg bestanden / mappen toe aan het gitignore bestand en sla het op.

3. Wis ze nu uit de git cache met behulp van deze commando's (als er meer dan één directory is, verwijder ze dan één voor één door deze opdracht opnieuw uit te voeren)

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

4. Maak nu een commit en klik , gebruik deze commando's. Hierdoor worden deze bestanden verwijderd van git remote en wordt git gestopt met het volgen van deze bestanden.

 git add . git commit -m "removed unnecessary files from git" git push origin 
8
20 сент. Het antwoord wordt gegeven door Shamsul Arefin Sajib 20 Sep. 2018-09-20 13:52 '18 om 13:52 uur 2018-09-20 13:52

Het antwoord van Matt Fear was de meest effectieve IMHO. Het volgende is slechts een PowerShell-script voor degenen die op Windows alleen bestanden uit hun git-repository verwijderen, wat overeenkomt met hun uitzonderingenlijst.

 # 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 . 
6
25 дек. Het antwoord wordt gegeven door Ameer Deen 25 dec. 2013-12-25 03:51 '13 om 3:51 2013-12-25 03:51

Verplaats of kopieer het bestand naar een veilige plaats zodat u het niet kwijtraakt. Dan git rm bestand en commit. Het bestand wordt weergegeven als u terugkeert naar een van deze eerdere commits of naar een ander filiaal waar het niet is verwijderd. In alle toekomstige commits ziet u het bestand echter niet meer. Als het bestand in git is om te negeren, kun je het terugzetten naar de map en git zal het niet zien.

5
13 авг. Antwoord gegeven door Apreche 13 aug 2009-08-13 22:27 '09 om 10:27 uur 2009-08-13 22:27

Reactie kopiëren / plakken: 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

Deze opdracht negeert bestanden die al zijn overgebracht naar de Git-repository, maar nu hebben we ze toegevoegd aan .gitignore .

5
19 нояб. Antwoord youhans 19 november 2018-11-19 14:21 '18 om 14:21 uur 2018-11-19 14:21

BFG is speciaal ontworpen om ongewenste gegevens, zoals grote bestanden of wachtwoorden uit Git-archieven, te verwijderen, dus het heeft een eenvoudige vlag die grote historische bestanden (niet in uw huidige) zal verwijderen: "-strip-blobs-more-than"

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

Als u bestanden op naam wilt opgeven, kunt u dit ook doen:

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

BFG is 10-1000x sneller dan de Git-filtertak en is meestal veel gemakkelijker te gebruiken - bekijk de instructies voor volledig gebruik en voorbeelden voor meer details.

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

3
03 сент. Antwoord gegeven door Meir Gerenstadt 03 sep. 2017-09-03 15:37 17 om 15:37 uur 2017-09-03 15:37 uur

Ik vond het antwoord van JonBrave leuk, maar ik heb behoorlijk vuile werkmappen die oplossen -een, het maakt me een beetje bang, dus dat is wat ik deed:

git config --global alias.exclude-ignored '! 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 "nieuwe gitignore en verwijder genegeerde bestanden van index"

vernietiging:

 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" 
  • verwijder de genegeerde bestanden uit de index
  • Stage.gitignore en de bestanden die u zojuist hebt verwijderd.
  • vastleggen
2
08 авг. Het antwoord wordt gegeven door Jay Irvine 08 aug. 2018-08-08 23:49 '18 om 23:49 uur 2018-08-08 23:49 uur

Als u de CLI niet wilt gebruiken en niet met Windows wilt werken, is een zeer eenvoudige oplossing om TortoiseGit te gebruiken, deze heeft de actie "Verwijderen (lokaal opslaan)" in het menu, wat prima werkt.

2
15 марта '18 в 14:04 2018-03-15 14:04 Het antwoord wordt gegeven door Pedi T. 15 maart '18 om 14:04 uur 2018-03-15 14:04 uur

Dit is niet > (v2.17.1 op het moment van schrijven).

De .gitignore negeert .gitignore bestanden, maar verwijderd. U kunt dit zelf verifiëren door het volgende script uit te voeren. De laatste expressie op git status zou "niets doen" moeten zeggen.

 # 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 antwoord werd gegeven door Lloyd op 13 juni 18 om 19:21 uur 2018-06-13 19:21

Vooral voor IDE-gebaseerde bestanden, gebruik ik dit:

Bijvoorbeeld slnx.sqlite, ik ben er als volgt volledig van afgekomen:

 git rm {PATH_OF_THE_FILE}/slnx.sqlite -f git commit -m "remove slnx.sqlite" 

Houd er rekening mee dat sommige van deze bestanden enkele lokale gebruikersvoorkeuren en voorkeuren voor projecten opslaan (bijvoorbeeld welke bestanden u open had). Dus, elke keer dat u uw IDE verplaatst of wijzigt, verandert dit bestand en controleert het daarom en toont dat er niet-gecommiteerde wijzigingen zijn.

0
05 апр. het antwoord is curiousBoy 05 april 2019-04-05 21:48 19 om 21:48 uur 2019-04-05 21:48

In het geval van een reeds toegewezen DS_Store :

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

Negeer ze:

 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 

Maak tot slot een oplossing!

0
23 апр. het antwoord wordt gegeven door user7718859 23 apr. 2018-04-23 00:14 '18 om 0:14 2018-04-23 00:14

Op 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. Verwijder de DS_Store-bestanden uit de lijst met bestanden die worden gevolgd door git in de foo-tak:

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

2. Vastleggen:

 $ git commit -m "Removed .DS_Store files" 

3. Controleer of bestanden niet >

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

4. Klik om ze uit de console te verwijderen:

 $ git push 
-5
13 янв. Antwoord van Raphvanns 13 januari 2017-01-13 22:53 17 om 10:53 2017-01-13 22:53

Zie andere vragen over of Stel een vraag