Hoe kan ik een bestand uit een Git-repository verwijderen?

Ik heb een bestand met de naam "file1.txt" toegevoegd aan een Git-repository. Daarna heb ik het vastgelegd, een paar mappen toegevoegd met de naam dir1 en dir2, en ze vastgelegd in de Git-repository.

De huidige repository heeft nu "file1.txt", dir1 en dir2. Hoe kan ik "file1.txt" verwijderen zonder anderen te beïnvloeden, zoals dir1 en dir2?


Antwoord 1, autoriteit 100%

Gebruik git rm.

Als je het bestand uit de Git-repository en het bestandssysteem wilt verwijderen, gebruik dan:

git rm file1.txt
git commit -m "remove file1.txt"

Maar als je het bestand alleen uit de Git-repository wilt verwijderen en niet uit het bestandssysteem, gebruik dan:

git rm --cached file1.txt
git commit -m "remove file1.txt"

En om wijzigingen naar externe repo te pushen

git push origin branch_name

Antwoord 2, autoriteit 17%

git rm file.txt verwijdert het bestand uit de repo, maar verwijdert het ook uit het lokale bestandssysteem.

Om het bestand uit de repo te verwijderen en niet het uit het lokale bestandssysteem te verwijderen, gebruik je:
git rm --cached file.txt

De exacte situatie hieronder is waar ik git gebruik om versiebeheer voor de website van mijn bedrijf te behouden, maar de map “mickey” was een tmp-map om privé-inhoud te delen met een CAD-ontwikkelaar. Toen hij ENORME bestanden nodig had, maakte ik een privé, niet-gekoppelde map en ftpd de bestanden daar zodat hij ze via de browser kon ophalen. Toen ik vergat dat ik dit deed, voerde ik later een git add -A uit vanuit de basismap van de website. Vervolgens toonde git status de nieuwe bestanden die gecommitteerd moesten worden. Nu moest ik ze verwijderen uit git’s tracking en versiebeheer…

Voorbeelduitvoer hieronder is van wat me zojuist is overkomen, waarbij ik onbedoeld het bestand .003 heb verwijderd. Gelukkig kan het me niet schelen wat er is gebeurd met de lokale kopie naar .003, maar sommige van de andere momenteel gewijzigde bestanden waren updates die ik zojuist op de website heb aangebracht en het zou geweldig zijn als ze op de website waren verwijderd. lokaal bestandssysteem! “Lokaal bestandssysteem” = de live website (niet een geweldige praktijk, maar is realiteit).

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Update: dit antwoord krijgt wat verkeer, dus ik dacht ik vermeld mijn andere Git-antwoord deelt een aantal geweldige bronnen: Deze pagina heeft een afbeelding die Git voor mij helpen demystificeren. Het “Pro Git” boek is online en helpt me enorm.


Antwoord 3, autoriteit 2%

Ten eerste, als je git rm gebruikt, vooral voor meerdere bestanden, bedenk dat een wildcard wordt opgelost door de shell, niet door het git commando.

git rm -- *.anExtension
git commit -m "remove multiple files"

Maar als je bestand al op GitHub staat, dat kan (sinds juli 2013 ) verwijder het direct uit de web-GUI!

Bekijk eenvoudig een bestand in uw repository, klik op het prullenbakpictogram bovenaan en voer de verwijdering uit, net als elke andere webgebaseerde bewerking.

Vervolgens “git pull” op uw lokale opslagplaats, en dat zal het bestand ook lokaal verwijderen.
Wat maakt dit antwoord een (omweg) manier om een ​​bestand uit git repo te verwijderen?
(Om nog maar te zwijgen van het feit dat een bestand op GitHub is in een “git repo”)


knop verwijderen

(de commit geeft de verwijdering van dat bestand weer):

verwijdering doorvoeren

En zomaar is het weg.

Lees voor hulp bij deze functies onze Help-artikelen over maken, verhuizen, hernoemen en verwijderen bestanden.

Opmerking: aangezien het een versiebeheersysteem is, staat Git altijd voor je klaar als je het bestand later moet herstellen.

De laatste zin betekent dat het verwijderde bestand nog steeds deel uitmaakt van de geschiedenis en dat je het gemakkelijk genoeg kunt herstellen (maar nog niet via de GitHub-webinterface):

Zie “Een verwijderd bestand herstellen in een Git-opslagplaats“.


Antwoord 4, autoriteit 2%

Dit is de enige optie die voor mij werkte.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Opmerking: Vervang *.sql door uw bestandsnaam of bestandstype. Wees heel voorzichtig, want dit zal elke commit doorlopen en dit bestandstype eruit rippen.

BEWERKEN:
let op – na dit commando kun je niet duwen of trekken – je ziet de afwijzing van ‘niet-gerelateerde geschiedenis’ je kunt ‘git push –force -u origin master’ gebruiken om te duwen of te trekken


Antwoord 5

Bovendien, als het een map is die moet worden verwijderd en de daaropvolgende onderliggende mappen of bestanden, gebruik dan:

git rm -r foldername

Antwoord 6

Meer in het algemeen zal git help helpen met ten minste eenvoudige vragen zoals deze:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]
The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

Antwoord 7

Als u het bestand uit de repo wilt verwijderen, maar het in het bestandssysteem wilt laten staan ​​(wordt niet getraceerd):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Als u het bestand uit de repo en uit het bestandssysteem wilt verwijderen, zijn er twee opties:

  1. Als het bestand geen wijzigingen in de index heeft:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Als het bestand wijzigingen in de index heeft:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

Antwoord 8

git rm zal vanaf nu alleen het bestand op deze branch verwijderen, maar het blijft in de geschiedenis en git zal het onthouden.

De juiste manier om dit te doen is met git filter-branch, zoals anderen hier hebben vermeld. Het zal elke commit in de geschiedenis van de branch herschrijven om dat bestand te verwijderen.

Maar zelfs daarna kan git het onthouden omdat er verwijzingen naar kunnen zijn in reflog, remotes, tags en dergelijke.

Als je het in één stap volledig wilt wissen, raad ik je aan om git forget-blob

te gebruiken

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Het is makkelijk, doe gewoon git forget-blob file1.txt.

Dit zal elke referentie verwijderen, git filter-branch doen, en tenslotte de git garbage collector git gc uitvoeren om dit bestand in je repo volledig te verwijderen.


Antwoord 9

Opmerking: als je alleen bestanden van git wilt verwijderen, gebruik dan hieronder:

git rm --cached file1.txt

Als u ook van de harde schijf wilt verwijderen:

git rm file1.txt

Als u een map wilt verwijderen (de map bevat mogelijk weinig bestanden), moet u deze verwijderen met een recursief commando, zoals hieronder:

git rm -r foldername

Als u een map in een andere map wilt verwijderen

git rm -r parentFolder/childFolder

Vervolgens kun je zoals gewoonlijk commit en push. Als u echter de verwijderde map wilt herstellen, kunt u dit volgen: verwijderde bestanden herstellen van git is mogelijk.

Van document:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…?

OPTIES

<file>…?

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

kan nodig zijn om ze te shell-ontsnappen. Een leidende directorynaam (bijv. dir to
verwijder dir/file1 en dir/file2) kunnen worden gegeven om alle bestanden in . te verwijderen
de directory, en recursief alle subdirectories, maar dit vereist:
de -r optie om expliciet te worden gegeven.
-f
--force

Override the up-to-date check.

-n
--dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opdrachtregelopties).
--cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

–ignore-unmatch

Exit with a zero status even if no files matched.

-q
--quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Lees meer in het officiële document.


Antwoord 10

Een andere manier als u het bestand uit uw lokale map wilt verwijderen met de opdracht rm en vervolgens de wijzigingen naar de externe server wilt pushen.

rm file1.txt
git commit -a -m "Deleting files"
git push origin master

Antwoord 11

In mijn geval probeerde ik het bestand op github te verwijderen na een paar commits maar op te slaan op de computer

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

en later werd dit bestand genegeerd


Antwoord 12

Een specifiek bestand verwijderen

git rm bestandsnaam

Om alle niet-getrackte bestanden recursief in één keer op te schonen uit een map

git clean -fdx


Antwoord 13

Als je de GitHub voor Windows-applicatie hebt, kun je een bestand in 5 eenvoudige stappen verwijderen:

  • Klik op Synchroniseren.
  • Klik op de map waar het bestand zich bevindt en selecteer uw laatste versie van het bestand.
  • Klik op tools en selecteer “Open hier een shell.”
  • Typ in de shell: “rm {filename}” en druk op enter.
  • Voeg de wijziging door en synchroniseer opnieuw.

Antwoord 14

Volgens de documentatie.

git rm --cached file1.txt

Als het om gevoelige gegevens gaat, kun je beter niet zeggen dat je het bestand hebt verwijderd, maar het gewoon in de laatst bekende commit opnemen:

0. Laatste toezegging wijzigen

git commit --amend -CHEAD

Als je het bestand uit de hele git-geschiedenis wilt verwijderen, volgens de documentatie moet u het volgende doen:

1. Verwijder het uit uw lokale geschiedenis

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Vergeet niet dit bestand op te nemen in .gitignore (als het een bestand is dat u nooit wilt delen (zoals wachtwoorden…):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Als u de afstandsbediening moet verwijderen

git push origin --force --all

4. Als u het ook uit tag-releases moet verwijderen:

git push origin --force --tags

Antwoord 15

  1. Verwijder eerst bestanden uit de lokale repository.

    git rm -r Bestandsnaam

    of, verwijder bestanden alleen uit de lokale repository maar uit het bestandssysteem

    git rm –cached bestandsnaam

  2. Ten tweede, wijzigingen doorvoeren in lokale repository.

    git commit -m "unwanted files or some inline comments"   
    
  3. Eindelijk, update/push lokale wijzigingen naar de externe repository.

    git push 
    

Antwoord 16

Het antwoord van Greg Hewgill, dat is bewerkt door Johannchopin heeft me geholpen, omdat ik er niet om gaf het bestand volledig uit de geschiedenis te verwijderen.
In mijn geval was het een directory, dus de enige wijziging die ik deed was het gebruik van:

git rm -r --cached myDirectoryName

in plaats van “git rm –cached file1.txt”
..gevolgd door:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name

Bedankt Greg Hewgill en Johannchopin!


Antwoord 17

ga naar je projectmap en typ:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

druk daarna op –force for delete file van alle commits.

git push origin --force --all

Antwoord 18

Ik heb veel van de voorgestelde opties geprobeerd en geen enkele leek te werken (ik zal de verschillende problemen niet opsommen).
Wat ik uiteindelijk deed, wat werkte, was eenvoudig en intuïtief (voor mij) was:

  1. verplaats de hele lokale repo ergens anders
  2. kloon de repo opnieuw van master naar je lokale schijf
  3. kopieer de bestanden/map van je originele kopie in #1 terug naar de nieuwe kloon van #2
  4. zorg ervoor dat het grote probleembestand niet aanwezig is of uitgesloten is in het .gitignore-bestand
  5. doe de gebruikelijke git add/git commit/git push

Antwoord 19

Nadat je het bestand uit de repo hebt verwijderd met git rm kun je BFG Repo-Cleaner om het bestand volledig en gemakkelijk uit de repo-geschiedenis te wissen.


Antwoord 20

Ik heb obj- en bin-bestanden die per ongeluk in de repo zijn terechtgekomen en ik wil niet dat ze mijn lijst met ‘gewijzigde bestanden’ vervuilen

Nadat ik merkte dat ze naar de afstandsbediening gingen, negeerde ik ze door dit toe te voegen aan .gitignore

/*/obj
/*/bin

Het probleem is dat ze al in de afstandsbediening staan ​​en als ze worden gewijzigd, verschijnen ze als gewijzigd en vervuilen ze de lijst met gewijzigde bestanden.

Als je ze niet meer wilt zien, moet je de hele map uit de externe repository verwijderen.

In een opdrachtprompt:

  1. CD naar de repo-map (d.w.z. C:\repos\MyRepo)
  2. Ik wil SSIS\obj verwijderen. Het lijkt erop dat u alleen op het hoogste niveau kunt verwijderen, dus u moet nu een cd naar SSIS: (d.w.z. C:\repos\MyRepo\SSIS)
  3. Typ nu de magische bezwering git rm -r -f obj
    • rm=verwijder
    • -r = recursief verwijderen
    • -f = betekent kracht, want je meent het echt
    • obj is de map
  4. Voer nu git commit -m "remove obj folder"

Ik kreeg een alarmerend bericht dat 13 bestanden zijn gewijzigd 315222 verwijderingen

Omdat ik de CMD-regel niet wilde opzoeken, ging ik naar Visual Sstudio en deed een synchronisatie om deze toe te passen op de afstandsbediening


Antwoord 21

Door gewoon naar het bestand in je github-repository te gaan, kun je het verwijderpictogram naast Raw|Blame zien en vergeet niet op de knop Wijzigingen vastleggen te klikken. En je kunt zien dat je bestand is verwijderd.


Antwoord 22

Als u bestanden van een bepaalde extensie moet verwijderen (bijvoorbeeld gecompileerde bestanden), kunt u het volgende doen om ze allemaal tegelijk te verwijderen:

git remove -f *.pyc

Antwoord 23

Als je niet in je lokale repo maar in git repo opslaat, open dan gewoon het bestand in git repo via de webinterface en zoek de knop Verwijderen in de rechterhoek van de interface.
Klik hier om de interface te bekijken Optie verwijderen

LEAVE A REPLY

Please enter your comment!
Please enter your name here

nineteen − 9 =

Other episodes