Hoe kan ik Git een bestand laten “vergeten” dat werd bijgehouden, maar nu in .gitignore staat?

Er is een bestand dat werd gevolgd door Git, maar nu staat het bestand op de .gitignorelijst.

Dat bestand blijft echter verschijnen in git statusnadat het is bewerkt. Hoe dwing je Git om het helemaal te vergeten?


Antwoord 1, autoriteit 100%

.gitignorevoorkomt dat niet-getrackte bestanden worden toegevoegd (zonder een add -f) aan de set bestanden die door Git worden bijgehouden, maar Git blijft alle bestanden volgen die al worden gevolgd.

Als u een bestand niet meer wilt volgen, moet u het uit de index verwijderen. Dit kan worden bereikt met dit commando.

git rm --cached <file>

Als u een hele map wilt verwijderen, moet u alle bestanden recursief verwijderen.

git rm -r --cached <folder>

Het verwijderen van het bestand uit de head-revisie zal gebeuren bij de volgende commit.

WAARSCHUWING: Hoewel hiermee het fysieke bestand niet van uw lokale computer wordt verwijderd, worden de bestanden wel verwijderd van andere ontwikkelaarsmachines bij de volgende git pull.


Antwoord 2, autoriteit 43%

De reeks opdrachten hieronder verwijdert alle items uit de Git-index (niet uit de werkdirectory of lokale repository), en werkt vervolgens de Git-index bij, terwijl Git negeert. PS. Index = Cache

Eerst:

git rm -r --cached .
git add .

Dan:

git commit -am "Remove ignored files"

Of als oneliner:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

Antwoord 3, autoriteit 20%

git update-indexde taak voor mij:

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

Opmerking: Deze oplossing is eigenlijk onafhankelijk van .gitignorezoals Gitignore alleen voor niet-gesraceerde bestanden is.


Update, een betere optie

Aangezien dit antwoord is gepost, is een nieuwe optie gemaakt en die de voorkeur heeft. U moet --skip-worktreegebruiken die is voor gewijzigde beheerd bestanden die de gebruiker niet meer wil plegen en --assume-unchangedvoor prestaties om git te voorkomen om de status van grote gevolgde bestanden te controleren. Zie https://stackoverflow.com/a/13631525/717372 voor meer informatie …

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

om

te annuleren

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

4, Autoriteit 4%

git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Hiermee neemt u de lijst met de genegeerde bestanden in, verwijdert ze uit de index en verbindt de wijzigingen.


5

Ik gebruik deze opdracht altijd om die niet-gesraceerde bestanden te verwijderen.
One-Line, Unix-Style, Clean Output:

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

Het geeft een vermelding van al uw genegeerde bestanden, vervangt elke uitgangslijn met een geciteerde regel in plaats daarvan om paden met spaties binnen te hanteren, en passeert alles op git rm -r --cachedom de paden / bestanden te verwijderen / Directories van de index.


6

Verplaats het uit, plegen en verplaats het dan terug.

Dit heeft in het verleden voor mij gewerkt, maar er is waarschijnlijk een ‘lichtere’ manier om dit te bereiken.


Antwoord 7

Gebruik dit wanneer:

  1. U wilt veel bestanden opheffen, of
  2. Je hebt je .gitignore-bestand bijgewerkt

Bron: Ontgrendel bestanden die al aan Git-repository zijn toegevoegd op basis van .gitignore

Stel dat je al een aantal bestanden hebt toegevoegd aan/toegezegd aan je Git-repository en ze vervolgens toevoegt aan je .gitignore-bestand; deze bestanden zullen nog steeds aanwezig zijn in uw repository-index. In dit artikel zullen we zien hoe u er vanaf kunt komen.

Stap 1: Voer al uw wijzigingen door

Zorg ervoor dat al uw wijzigingen zijn vastgelegd voordat u doorgaat, inclusief uw .gitignore-bestand.

Stap 2: Verwijder alles uit de repository

Om uw repository te wissen, gebruik:

git rm -r --cached .
  • rmis de verwijderopdracht
  • -rstaat recursieve verwijdering toe
  • –cachedverwijdert alleen bestanden uit de index. Je bestanden zijn er nog steeds.

Het rmcommando kan meedogenloos zijn. Als je vooraf wilt proberen wat het doet, voeg dan de vlag -nof --dry-runtoe om dingen te testen.

Stap 3: Lees alles

git add .

Stap 4: Vastleggen

git commit -m ".gitignore fix"

Je repository is schoon 🙂

Druk de wijzigingen naar uw afstandsbediening om de wijzigingen daar ook van kracht te zien.


Antwoord 8

Als je een bijgehouden bestand niet kunt git rmomdat andere mensen het misschien nodig hebben (waarschuwing, zelfs als jegit rm --cached, wanneer iemand anders deze wijziging krijgt, worden hun bestanden verwijderd in hun bestandssysteem). Deze worden vaak gedaan vanwege overschrijvingen van configuratiebestanden, authenticatiegegevens, enz. Kijk op https://gist.github.com /1423106voor manieren waarop mensen aan het probleem hebben gewerkt.

Om samen te vatten:

  • Laat uw toepassing zoeken naar een genegeerd bestand config-overide.ini en gebruik dat over het vastgelegde bestand config.ini (of zoek naar ~/.config/myapp.ini of $MYCONFIGFILE)
  • Bevestig bestand config-sample.ini en negeer bestand config.ini, zorg dat een script of iets dergelijks het bestand indien nodig kopieert.
  • Probeer gitattributes clean/smudge magic te gebruiken om de wijzigingen voor je toe te passen en te verwijderen, veeg bijvoorbeeld het configuratiebestand uit als een checkout van een alternatieve branch en reinig het configuratiebestand als een checkout van HEAD. Dit zijn lastige dingen, ik raad het de beginnende gebruiker niet aan.
  • Bewaar het configuratiebestand op een deployment-branch die eraan is toegewezen en die nooit wordt samengevoegd tot master. Als je wilt implementeren/compileren/testen, merge je met die branch en krijg je dat bestand. Dit is in wezen de smudge/clean-aanpak, behalve het gebruik van menselijk samenvoegbeleid en extra-git-modules.
  • Anti-aanbeveling: gebruik geen ‘aanname-onveranderd’, het zal alleen maar eindigen in tranen (omdat git liegen tegen zichzelf zal veroorzaken dat er slechte dingen gebeuren, zoals dat je wijziging voor altijd verloren gaat).

Antwoord 9

  1. Update je .gitignore-bestand – voeg bijvoorbeeld een map toe die je niet wilt bijhouden aan .gitignore.

  2. git rm -r --cached .– Verwijder alle bijgehouden bestanden, inclusief gewenste en ongewenste. Uw code is veilig zolang u deze lokaal heeft opgeslagen.

  3. git add .– Alle bestanden worden weer toegevoegd, behalve die in .gitignore.


Petje voor @AkiraYamamoto voor het wijzen in de goede richting.


Antwoord 10

Voer de volgende stappen serieel uit en het komt goed.

  1. Verwijderde per ongeluk toegevoegde bestanden uit de directory/opslag. U kunt de opdracht “rm -r” (voor Linux) gebruiken of ze verwijderen door door de mappen te bladeren. Of verplaats ze naar een andere locatie op uw pc. (Misschien moet u de IDE sluiten als deze wordt uitgevoerd voor verplaatsen/verwijderen.)

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

  3. Verwijder ze nu verwijderuit de Git-cachemet behulp van deze opdrachten (als er meer dan één map is, verwijder ze dan één voor één door deze opdracht herhaaldelijk uit te voeren )

    git rm -r --cached path-to-those-files
    
  4. Nu doeeen vastleggen en pushendoor de volgende commando’s te gebruiken. Dit zal die bestanden van Git remote verwijderenen Git stoppen met het volgendie bestanden.

    git add .
     git commit -m "removed unnecessary files from Git"
     git push origin
    

Antwoord 11

Ik denk dat Git een bestand misschien niet helemaal kan vergeten vanwege het concept ervan (sectie “Momentopnamen, geen verschillen”).

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

Maar elke keer dat je in Git commit, of de status van je project opslaat, wordt er in feite een foto gemaakt van hoe al je bestandener op dat moment uitzien en worden opgeslagen een verwijzing naar die momentopname. Dus als je een bestand eenmaal hebt toegevoegd, zal het altijd aanwezig zijn in die snapshot.

Deze twee artikelen waren nuttig voor mij:

git veronderstel-unchanged vs skip-worktreeen Wijzigingen in bijgehouden bestanden negeren met Git

Op basis daarvan doe ik het volgende, als het bestand al wordt bijgehouden:

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

Vanaf dit moment worden alle lokale wijzigingen in dit bestand genegeerd en gaan ze niet meer naar remote. Als het bestand op afstand wordt gewijzigd, zal er een conflict optreden wanneer git pull. Stash werkt niet. Om het op te lossen, kopieer je de bestandsinhoud naar een veilige plaatsen volg je deze stappen:

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

De bestandsinhoud wordt vervangen door de externe inhoud. Plak uw wijzigingen van de 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>zal uitvoeren, zouden problemen met pullafwezig moeten zijn. Deze oplossing is geschikt voor configuratiebestanden, wanneer elke ontwikkelaar zijn eigen projectconfiguratie heeft.

Het is niet erg handig om dit elke keer te doen, wanneer het bestand op afstand is gewijzigd, maar het kan het beschermen tegen overschrijven door externe inhoud.


Antwoord 12

Voer de volgende stappen uit voor een bestand/map:

Een bestand verwijderen:

  1. moet dat bestand toevoegen aan .gitignore.
  2. moet dat bestand verwijderen met het commando (git rm –cached bestandsnaam).
  3. moeten draaien (git add .).
  4. moeten (commit -m) “bestand verwijderd”.
  5. en tot slot, (git push).

Bijvoorbeeld:

Ik wil het bestand test.txtverwijderen. Ik heb per ongeluk naar GitHub gepusht en wil het verwijderen. Commando’s zijn als volgt:

Voeg eerst “test.txt” toe aan bestand .gitignore

git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push

Map verwijderen:

  1. moet die map toevoegen aan bestand .gitignore.
  2. moet die map verwijderen met het commando (git rm -r –cached mapnaam).
  3. moeten draaien (git add .).
  4. moeten (commit -m) “map verwijderd”.
  5. en tot slot, (git push).

Bijvoorbeeld:

Ik wil de map/directory .ideaverwijderen. Ik heb per ongeluk naar GitHub gepusht en wil het verwijderen. De opdrachten zijn als volgt:

Voeg eerst .ideatoe aan het bestand .gitignore

git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push

13

Het antwoord van de kopie / plakken is git rm --cached -r .; git add .; git status;

Deze opdracht zal de inhoud van de .gitignore-bestand niet wijzigen. Het negeert gewoon de bestanden die al zijn toegewijd aan een git-repository, maar nu hebben we ze toegevoegd aan .gitignore.

Het laatste deel van de opdracht (git status;) is alleen om de wijzigingen te bekijken en kan worden genegeerd.


14

De Antwoord van Matt Frear was de meest effectieve IMHO. Het volgende is slechts een PowerShell-script voor die op Windows om alleen bestanden uit hun git-repository te verwijderen die overeenkomt met hun uitsluitingslijst.

# 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 .

15

Verplaatsen of kopieer het bestand naar een veilige locatie, dus u verliest het niet. Dan ‘git rm’ het bestand en commit.

Het bestand zal nog steeds worden weergegeven als u terugkeert naar een van die eerdere commits, of een andere tak waar het niet is verwijderd. In alle toekomstige commits ziet u het bestand echter niet opnieuw. Als het bestand zich in de git negeert, kunt u het terug in de map verplaatsen en Git zal het niet zien.


16

De bfg is specifiek ontworpen voor het verwijderen van ongewenste gegevens zoals grote bestanden of wachtwoorden Van git-repositories, dus het heeft een eenvoudige vlag die alle grote historische (niet-in-in-your-current) bestanden zal verwijderen: ‘–strip-blobs-groter-dan’

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

Als u bestanden op naam wilt specificeren, kunt u dat ook doen:

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

De BFG is 10-1000x sneller dan git filter-branchen is over het algemeen veel gemakkelijker te gebruiken – bekijk de volledige gebruiksinstructiesen voorbeeldenvoor meer details.

Bron: Repositorygrootte verkleinen


Antwoord 17

Als je de CLI niet wilt gebruiken en aan Windows werkt, is een heel eenvoudige oplossing om TortoiseGit. Het heeft de actie “Verwijderen (houd lokaal)” in het menu, wat prima werkt.


Antwoord 18

Ik vond JonBrave’s antwoord, maar ik heb rommelig genoeg werkende mappen die me een beetje bang maken commit -a, dus dit is wat ik heb gedaan:

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 "new gitignore and remove ignored files from index"'

Het opsplitsen:

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 genegeerde bestanden uit de index
  • stage .gitignore en de bestanden die je zojuist hebt verwijderd
  • toezeggen

Antwoord 19

Dit is niet langer een probleem in de nieuwste Git(v2.17.1 op het moment van schrijven).

Het bestand .gitignorenegeert uiteindelijk bijgehouden maar verwijderde bestanden. U kunt dit zelf testen door het volgende script uit te voeren. Het laatste git statusstatement zou “niets te committen” moeten rapporteren.

# Create an empty repository
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

20

In het geval van reeds toegewijde DS_Store:

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

Negeer ze door:

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

Tot slot, doe een toezegging!


Antwoord 21

Vooral voor de op IDE gebaseerde bestanden, gebruik ik dit:

Bijvoorbeeld, voor het bestand slnx.sqlite, heb ik het als volgt volledig verwijderd:

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

Houd er rekening mee dat sommige van die bestanden enkele lokale gebruikersinstellingen en voorkeuren voor projecten bevatten (zoals welke bestanden je open had staan). Dus elke keer dat u navigeert of wijzigingen aanbrengt in uw IDE, wordt dat bestand gewijzigd en wordt het daarom uitgecheckt en weergegeven als niet-vastgelegde wijzigingen.


Antwoord 22

In mijn geval moest ik “.envrc” in het .gitignorebestand zetten.

En toen gebruikte ik:

git update-index --skip-worktree .envrc
git rm --cached .envrc

En het bestand is verwijderd.

Toen pleegde ik opnieuw en vertelde dat het bestand was verwijderd.

Maar toen ik het commando git log -pgebruikte, werd de inhoud van het bestand (dat waren geheime referenties van de Amazon S3) toonde de inhoud die was verwijderd en ik wil deze inhoud nooit weergeven in de geschiedenis van de Git-repository.

Toen gebruikte ik dit commando:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .envrc' HEAD

En ik zie de inhoud niet meer.


Antwoord 23

Zo heb ik mijn probleem opgelost:

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD

git push

Hierin proberen we de geschiedenis van dat specifieke bestand in eerdere commits ook te herschrijven.

Voor meer informatie kunt u verwijzen naar de man pagina filter-tak hier .

Bron: Gevoelige gegevens verwijderen uit een repository – met behulp van filter-tak

Bron: Git: Hoe een groot bestand te verwijderen dat ten onrechte is toegewijd


24

In mijn geval hier had ik verschillende .lock-bestanden in verschillende mappen die ik moest verwijderen. Ik liep het volgende en het werkte zonder in elke map te hoeven gaan om ze te verwijderen:

git rm -r --cached **/*.lock

Doe dit in elke map onder de ‘root’ van waar ik was en heb alle bestanden uitgesloten die overeenkomen met het patroon.


25

Als iemand het moeilijk heeft op Windows en u de volledige map wilt negeren, gaat u naar de gewenste ‘map’ op bestandsverkenner, met de rechtermuisknop en doe ‘git bash hier’ (git voor Windows had moeten zijn geïnstalleerd) .

Voer deze opdracht uit:

git ls-files -z | xargs -0 git update-index --assume-unchanged

26

Als u Gitignore-bestand hebt gemaakt met de opdracht zoals echo node_modules >> .gitignore, het zal niet werken.

De Windows-terminal bespaart het bestand in UCS-2 LE BOMen GIT lijkt niet te accepteren.

U kunt dit oplossen door in Notepadte openen en het opnieuw op te nemen met UTF-8CODEERING

het werkt nu.

Ik denk dat ze dit nodig hebben om dit te repareren sinds het doen van echo "filetoignore" >> .gitignorelijkt eigenlijk erg handig

Other episodes