Er is een bestand dat werd gevolgd door Git, maar nu staat het bestand op de .gitignore
lijst.
Dat bestand blijft echter verschijnen in git status
nadat het is bewerkt. Hoe dwing je Git om het helemaal te vergeten?
Antwoord 1, autoriteit 100%
.gitignore
voorkomt 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-index
de taak voor mij:
git update-index --assume-unchanged <file>
Opmerking: Deze oplossing is eigenlijk onafhankelijk van .gitignore
zoals 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-worktree
gebruiken die is voor gewijzigde beheerd bestanden die de gebruiker niet meer wil plegen en --assume-unchanged
voor 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 --cached
om 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:
- U wilt veel bestanden opheffen, of
- 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 rm
commando kan meedogenloos zijn. Als je vooraf wilt proberen wat het doet, voeg dan de vlag -n
of --dry-run
toe 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 rm
omdat 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
-
Update je
.gitignore
-bestand – voeg bijvoorbeeld een map toe die je niet wilt bijhouden aan.gitignore
. -
git rm -r --cached .
– Verwijder alle bijgehouden bestanden, inclusief gewenste en ongewenste. Uw code is veilig zolang u deze lokaal heeft opgeslagen. -
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.
-
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.)
-
Voeg de bestanden / mappen nu toe aan het .gitignore-bestand en sla het op.
-
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
-
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 pull
afwezig 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:
- moet dat bestand toevoegen aan .gitignore.
- moet dat bestand verwijderen met het commando (git rm –cached bestandsnaam).
- moeten draaien (git add .).
- moeten (commit -m) “bestand verwijderd”.
- 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:
- moet die map toevoegen aan bestand .gitignore.
- moet die map verwijderen met het commando (git rm -r –cached mapnaam).
- moeten draaien (git add .).
- moeten (commit -m) “map verwijderd”.
- 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-branch
en 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 status
statement 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 -p
gebruikte, 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 BOM
en GIT lijkt niet te accepteren.
U kunt dit oplossen door in Notepad
te openen en het opnieuw op te nemen met UTF-8
CODEERING
het werkt nu.
Ik denk dat ze dit nodig hebben om dit te repareren sinds het doen van echo "filetoignore" >> .gitignore
lijkt eigenlijk erg handig