git: Hoe negeer je alle aanwezige niet-getrackte bestanden?

Is er een handige manier om alle niet-getrackte bestanden en mappen in een git-repository te negeren?
(Ik weet van de .gitignore.)

Dus git statuszou weer een schoon resultaat opleveren.


Antwoord 1, autoriteit 100%

Zoals al gezegd, gebruik om van status uit te sluiten:

git status -uno  # must be "-uno" , not "-u no"

Als u in plaats daarvan permanent niet-getrackte bestanden wilt negeren, kunt u vanuit de hoofdmap van uw project starten:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Elke volgende aanroep naar git statuszal die bestanden expliciet negeren.

UPDATE: het bovenstaande commando heeft een klein nadeel: als je nog geen .gitignorebestand hebt, zal je gitignore zichzelf negeren! Dit gebeurt omdat het bestand .gitignorewordt aangemaakt voordat de git status --porcelainwordt uitgevoerd. Dus als je nog geen .gitignore-bestand hebt, raad ik aan om:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Hiermee wordt een subshell gemaakt die voordathet bestand .gitignorewordt voltooid.

UITLEG VAN HET COMMANDOaangezien ik veel stemmen krijg (dank je!) Ik denk dat ik het commando beter een beetje kan uitleggen:

  • git status --porcelainwordt gebruikt in plaats van git status --shortomdat manualstelt: “Geef de uitvoer in een gemakkelijk te ontleden formaat voor scripts. Dit is vergelijkbaar met de korte uitvoer, maar zal stabiel blijven in git-versies en ongeacht de gebruikersconfiguratie.” We hebben dus zowel de parseeerbaarheid als de stabiliteit;
  • grep '^??'filtert alleen de regels die beginnen met ??, wat volgens de git-statushandleiding, komen overeen met de niet-getrackte bestanden;
  • cut -c4-verwijdert de eerste 3 tekens van elke regel, wat ons alleen het relatieve pad naar het niet-gevolgde bestand geeft;
  • de |symbolen zijn pijpen, die de uitvoer van de vorige opdracht doorgeven aan de invoer van de volgende opdracht;
  • de symbolen >>en >zijn redirect-operators, die respectievelijk de uitvoer van de vorige opdracht aan een bestand toevoegen of een nieuw bestand overschrijven/maken.

EEN ANDERE VARIANTvoor degenen die liever sedin plaats van grepen cut, is hier een andere manier:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

Antwoord 2, autoriteit 21%

Als je deze bestanden permanent wilt negeren, is een eenvoudige manier om ze toe te voegen aan .gitignore:

  1. Verander in de root van de git tree.
  2. git ls-files --others --exclude-standard >> .gitignore

Hiermee worden alle bestanden in niet-getrackte mappen opgesomd, wat al dan niet is wat u wilt.


Antwoord 3, autoriteit 6%

Gevonden in de handleiding

De mode parameter wordt gebruikt om de verwerking van niet-getrackte bestanden te specificeren. Het is optioneel: het is standaard ingesteld op alle, en indien gespecificeerd, moet het bij de optie blijven (bijv. -uno, maar niet -u no).

git status -uno


Antwoord 4

Twee manieren:

  • gebruik het argument -unovoor git-status. Hier is een voorbeeld:

    [jenny@jenny_vmware:ft]$ git status
    # On branch ft
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #       foo
    nothing added to commit but untracked files present (use "git add" to track)
    [jenny@jenny_vmware:ft]$ git status -uno
    # On branch ft
    nothing to commit (working directory clean)
    
  • Of je kunt de bestanden en mappen toevoegen aan .gitignore, in welk geval ze nooit zullen verschijnen.


Antwoord 5

-u notoont ook geen niet-gefaseerde bestanden. -unowerkt naar wens en toont unstaged, maar verbergt untracked.


Antwoord 6

IMHO beter dan het geaccepteerde antwoord is om het volgende te gebruiken:

git config --local status.showUntrackedFiles no

Het geaccepteerde antwoord werkt niet als er nieuwe bestanden worden toegevoegd die niet in .gitignore

staan


Antwoord 7

In het geval dat u geen Unix-achtigbesturingssysteem gebruikt, zou dit werken op Windowsmet behulp van PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Het bestand .gitignoremoet echter een nieuwe lege regel hebben, anders zal het tekst aan de laatste regel toevoegen, ongeacht of het inhoud heeft.

Dit is misschien een beter alternatief:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


Antwoord 8

Als je veelniet-getrackte bestanden hebt en ze niet allemaal wilt “gitignore” hebben, houd er dan rekening mee dat, aangezien git 1.8.3 (22 april 2013), git statuszal de --untracked-files=novermelden, zelfs als je die optie niet in de eerste plaats hebt toegevoegd!

git status” raadt gebruikers aan om de optie --untracked=note gebruiken als het te lang duurt.


Antwoord 9

Ik kwam hier om een iets ander probleem op te lossen. Misschien is dit nuttig voor iemand anders:

Ik maak een nieuwe branch feature-aaan. als onderdeel van deze branch maak ik nieuwe mappen aan en moet ik .gitignore aanpassen om er een aantal te onderdrukken. Dit gebeurt veel bij het toevoegen van nieuwe tools aan een project die verschillende cachemappen maken. .serverless, .terraform, enz.

Voordat ik klaar ben om dat weer samen te voegen tot master, moet ik iets anders bedenken, dus ik check masteropnieuw af, maar nu haalt git statusdie onderdrukte mappen op nogmaals, aangezien de .gitignore nog niet is samengevoegd.

Het antwoord hier is eigenlijk eenvoudig, hoewel ik deze blogom erachter te komen:

Bekijk gewoon het .gitignore-bestand van de feature-abranch

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"

Other episodes