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 clean
s 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.