I det här avsnittet kommer vi att fokusera på en detaljerad diskussion av kommandot git clean. Git clean är i viss mån ett ”ångra”-kommando. Git clean kan betraktas som ett komplement till andra kommandon som git reset och git checkout. Medan dessa andra kommandon verkar på filer som tidigare lagts till i Git-spårningsindexet, verkar kommandot git clean på ospårade filer. Ospårade filer är filer som har skapats i din repo:s arbetskatalog men som ännu inte har lagts till i arkivets spårningsindex med hjälp av kommandot git add. För att bättre visa skillnaden mellan spårade och ospårade filer kan du tänka på följande exempel på kommandoraden:

 $ mkdir git_clean_test $ cd git_clean_test/ $ git init . Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/ $ echo "tracked" > ./tracked_file $ git add ./tracked_file $ echo "untracked" > ./untracked_file $ mkdir ./untracked_dir && touch ./untracked_dir/file $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file

Exemplet skapar ett nytt Git-repositorium i katalogen git_clean_test. Det fortsätter sedan med att skapa en tracked_file som läggs till i Git-indexet, dessutom skapas en untracked_file och en untracked_dir. Exemplet anropar sedan git status som visar utdata som anger Gits interna tillstånd av spårade och ospårade ändringar. Med arkivet i detta tillstånd kan vi utföra kommandot git clean för att demonstrera dess avsedda syfte.

 $ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean

I det här läget kan utförandet av standardkommandot git clean ge upphov till ett ödesdigert fel. Exemplet ovan visar hur detta kan se ut. Som standard är Git globalt konfigurerat för att kräva att git clean ska få ett ”force”-alternativ för att initieras. Detta är en viktig säkerhetsmekanism. När git clean slutligen utförs kan det inte göras ogjort. När git clean är helt utförd kommer git clean att göra en hård radering av filsystemet, vilket liknar utförandet av kommandoradsverktyget rm. Kontrollera att du verkligen vill radera de ospårade filerna innan du kör det.

Vanliga alternativ och användning

Med tanke på den tidigare förklaringen av git cleans standardbeteenden och förbehåll, demonstrerar följande innehåll olika git clean-användningsfall och de medföljande kommandoradsalternativen som krävs för att de ska kunna användas.

-n

Optionen -n kommer att utföra en ”torrkörning” av git clean. Detta visar vilka filer som kommer att tas bort utan att de faktiskt tas bort. Det är bästa praxis att alltid först utföra en torrkörning av git clean. Vi kan demonstrera det här alternativet i den demo repo som vi skapade tidigare.

 $ git clean -n Would remove untracked_file

Utmatningen visar att untracked_file kommer att tas bort när kommandot git clean exekveras. Lägg märke till att untracked_dir inte rapporteras i utmatningen här. Som standard kommer git clean inte att operera rekursivt på kataloger. Detta är ytterligare en säkerhetsmekanism för att förhindra oavsiktlig permanent radering.

 -f or --force

Valet force initierar den faktiska raderingen av ospårade filer från den aktuella katalogen. Force krävs om inte konfigurationsalternativet clean.requireForce är inställt på false. Detta tar inte bort ospårade mappar eller filer som anges med .gitignore. Låt oss nu utföra en live git clean i vår exempelrepo.

 $ git clean -f Removing untracked_file

Kommandot kommer att ge ut de filer som tas bort. Du kan se här att untracked_file har tagits bort. Om du utför git status vid denna tidpunkt eller gör en ls kommer du att se att untracked_file har tagits bort och inte finns någonstans att hitta. Som standard kommer git clean -f att arbeta på alla ospårade filer i den aktuella katalogen. Dessutom kan ett värde skickas med alternativet -f som tar bort en specifik fil.

 git clean -f -d include directories

Optionen -d talar om för git clean att du också vill ta bort alla ospårade kataloger, som standard ignorerar den kataloger. Vi kan lägga till alternativet -d till våra tidigare exempel:

 $ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/

Här har vi utfört en ”torrkörning” med hjälp av kombinationen -dn som visar att untracked_dir är redo att tas bort. Sedan utför vi en forcerad rensning och får utdata om att untracked_dir är borttagen.

 -x force removal of ignored files

Ett vanligt mönster för programvaruutgivning är att ha en bygg- eller distributionskatalog som inte är registrerad i repositories tracking index. Byggkatalogen kommer att innehålla flyktiga byggartefakter som genereras från den överlämnade källkoden. Denna byggkatalog läggs vanligtvis till i filen repositories .gitignore. Det kan vara lämpligt att även rensa denna katalog med andra ospårade filer. Alternativet -x talar om för git clean att även inkludera alla ignorerade filer. Liksom vid tidigare git clean-invokningar är det bästa sättet att utföra en ”torrkörning” först, innan den slutliga raderingen. Alternativet -x kommer att agera på alla ignorerade filer, inte bara projektbyggnadsspecifika filer. Detta kan vara oavsiktliga saker som ./.idea IDE-konfigurationsfiler.

 git clean -xf 

Likt -d-alternativet -x kan det överföras och komponeras med andra alternativ. Det här exemplet visar en kombination med -f som tar bort ospårade filer från den aktuella katalogen samt alla filer som Git vanligtvis ignorerar.

Interaktivt läge eller git clean interactive

Inom den ad hoc-kommandoradsavkörning som vi hittills har demonstrerat har git clean ett ”interaktivt” läge som du kan initiera genom att passera alternativet -i. Låt oss återbesöka exempelrepo:n från inledningen av detta dokument. I det initiala tillståndet kommer vi att starta en interaktiv ren session.

 $ git clean -di Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now>

Vi har initierat den interaktiva sessionen med alternativet -d så den kommer också att agera på vår untracked_dir. Det interaktiva läget kommer att visa en What now>-prompt som begär ett kommando att tillämpa på de ospårade filerna. Själva kommandona är ganska självförklarande. Vi kommer att ta en kort titt på var och en i en slumpmässig ordning och börjar med kommandot 6: help. Genom att välja kommando 6 förklaras de andra kommandona ytterligare:

 What now> 6 clean - start cleaning filter by pattern - exclude items from deletion select by numbers - select items to be deleted by numbers ask each - confirm each deletion (like "rm -i") quit - stop cleaning help - this screen ? - help for prompt selection
 5: quit

Är rakt igenom och avslutar den interaktiva sessionen.

 1: clean

Raderar de angivna objekten. Om vi skulle exekvera 1: clean vid denna tidpunkt skulle untracked_dir/ untracked_file tas bort.

 4: ask each

kommer att iterera över varje ospårad fil och visa en Y/N uppmaning om en radering. Det ser ut som följande:

 *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 4 Remove untracked_dir/ ? N Remove untracked_file ? N
 2: filter by pattern

Vi kommer att visa en ytterligare uppmaning som tar emot inmatning som används för att filtrera listan över ospårade filer.

 Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 2 untracked_dir/ untracked_file Input ignore patterns>> *_file untracked_dir/

Här matar vi in jokerteckenmönstret *_file som sedan begränsar listan över ospårade filer till endast untracked_dir.

 3: select by numbers

Som i kommando 2 fungerar kommando 3 för att förfina listan över ospårade filnamn. Den interaktiva sessionen kommer att fråga efter nummer som motsvarar ett ospårat filnamn.

 Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 3 1: untracked_dir/ 2: untracked_file Select items to delete>> 2 1: untracked_dir/ * 2: untracked_file Select items to delete>> Would remove the following item: untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help

Sammanfattning

För att sammanfatta är git clean en bekvämlighetsmetod för att ta bort ospårade filer i en repo:s arbetskatalog. Ospårade filer är de filer som finns i repo-katalogen men som ännu inte har lagts till i repo-indexet med git add. Sammantaget kan effekten av git clean åstadkommas med hjälp av git status och operativsystemets inhemska raderingsverktyg. Git clean kan användas tillsammans med git reset för att helt ångra alla tillägg och commits i ett arkiv.

Lämna ett svar

Din e-postadress kommer inte publiceras.