Eski ve bakımsız şubeleri uzak depomuzdan silmem gerekiyor. Uzak dalları son değiştirilme tarihlerine göre listelemek için bir yol bulmaya çalışıyorum ve yapamam.
Uzak dalları bu şekilde listelemenin kolay bir yolu var mı?
Eski ve bakımsız şubeleri uzak depomuzdan silmem gerekiyor. Uzak dalları son değiştirilme tarihlerine göre listelemek için bir yol bulmaya çalışıyorum ve yapamam.
Uzak dalları bu şekilde listelemenin kolay bir yolu var mı?
Yanıtlar:
commandlinefu'nun 2 ilginç önermesi vardır:
for k in `git branch | perl -pe s/^..//`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
veya:
for k in `git branch | sed s/^..//`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k --`\\t"$k";done | sort
Bu, Unix sözdiziminde yerel şubeler içindir. Kullanarak git branch -r
, benzer şekilde uzak dalları gösterebilirsiniz:
for k in `git branch -r | perl -pe 's/^..(.*?)( ->.*)?$/\1/'`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
Michael Forrest , açıklamalarda zsh'ın sed
ifade için kaçış gerektirdiğinden bahsediyor :
for k in git branch | perl -pe s\/\^\.\.\/\/; do echo -e git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1\\t$k; done | sort -r
kontinuity ekler yorumlarda :
Eğer zshrc'nizi eklemek istiyorsanız, aşağıdaki kaçış gereklidir.
alias gbage='for k in `git branch -r | perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r'
Birden çok satırda:
alias gbage='for k in `git branch -r | \
perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; \
do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | \
head -n 1`\\t$k; done | sort -r'
Not: n8tr 'ın cevabı dayalı git for-each-ref refs/heads
temizleyicidir. Ve daha hızlı .
Ayrıca bkz. " Yalnızca ad seçeneği git branch --list
? "
Daha genel olarak, üçlü bize yorumlarda hatırlatır :
$(command substitution)
Eskimiş backtick sözdizimine göre modern sözdizimini tercih edin .
(2014'te bu noktayı " Kabuk programlama arasındaki $(command)
ve `command`
kabuk programlama arasındaki fark nedir ? "
- İle satır okuma
for
.- Muhtemelen
git for-each-ref refs/remote
uzak şube adlarını makine tarafından okunabilir biçimde almak için geçiş yapın
/json
Herhangi bir commandlinefu.com URL'sinin sonuna nasıl ekleyebileceğiniz oldukça harika ve tüm komutları JSON olarak alacaksınız.
İşte ne kullanıyorum:
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
Bu çıktı:
2014-01-22 11:43:18 +0100 refs/heads/master
2014-01-22 11:43:18 +0100 refs/heads/a
2014-01-17 12:34:01 +0100 refs/heads/b
2014-01-14 15:58:33 +0100 refs/heads/maint
2013-12-11 14:20:06 +0100 refs/heads/d/e
2013-12-09 12:48:04 +0100 refs/heads/f
Uzak dallar için, "refs / heads" yerine "refs / remotes" kullanın:
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/remotes
Şube üzerindeki son yazarla da ilgileniyorsanız ve "sütun" aracını kullanıyorsanız , n8tr cevabını temel alarak şunları kullanabilirsiniz:
git for-each-ref --sort='-committerdate:iso8601' --format='%(committerdate:relative)|%(refname:short)|%(committername)' refs/remotes/ | column -s '|' -t
Hangi size verecek:
21 minutes ago refs/remotes/a John Doe
6 hours ago refs/remotes/b Jane Doe
6 days ago refs/remotes/master John Doe
En son bilgilere sahip olmak için daha önce "git fetch --prune" u aramak isteyebilirsiniz.
authordate
(dalın ilk oluşturulduğu zaman olduğu anlaşılıyor mu?). Eğer değiştirirseniz authordate
için committerdate
o zaman en son tarihlerini göreceksiniz her dalında taahhüt. : Böylece gibigit for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
Olivier Croquette'i inşa etmek , göreceli bir tarih kullanmayı ve şube adını şu şekilde kısaltmayı seviyorum:
git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads
Hangi çıktı verir:
21 minutes ago nathan/a_recent_branch
6 hours ago master
27 hours ago nathan/some_other_branch
29 hours ago branch_c
6 days ago branch_d
Tüm favori takma adlarınızı eklemek için bir Bash dosyası oluşturmanızı ve komut dosyasını ekibinize paylaşmanızı öneririm. İşte bunu eklemek için bir örnek:
#!/bin/sh
git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"
Sonra bunu güzelce biçimlendirilmiş ve sıralanmış bir yerel şube listesi almak için yapabilirsiniz:
git branches
@VonC tarafından yoruma eklemek için tercih ettiğiniz çözümü alın ve kolaylık sağlamak için ~ / .gitconfig takma ad listenize ekleyin:
[alias]
branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'
Sonra basit bir "git branchdate" listeyi sizin için yazdırır ...
--format='%(authordate)%09%(objectname:short)%09%(refname)'
her dalın kısa karmasını da alır.
| tac
, sadece, --sort='authordate'
yerine-authordate
İşte sonra da gözden ile geldi budur bu .
for REF in $(git for-each-ref --sort=-committerdate --format="%(objectname)" \
refs/remotes refs/heads)
do
if [ "$PREV_REF" != "$REF" ]; then
PREV_REF=$REF
git log -n1 $REF --date=short \
--pretty=format:"%C(auto)%ad %h%d %s %C(yellow)[%an]%C(reset)"
fi
done
PREV_REF
Çek aynı birden fazla şube noktaları işlerlerse çiftleri kaldırmaktır. (Uzaktan kumandada bulunan yerel bir dalda olduğu gibi.)
OP isteğine göre git branch --merged
ve git branch --no-merged
hangi dalların kolayca silinebileceğini belirlemede yararlı olduğunu unutmayın.
VonC'nin cevabına dayanarak iki varyant yaptım .
İlk değişkenim:
for k in `git branch -a | sed -e s/^..// -e 's/(detached from .*)/HEAD/'`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`;done | sort | column -t -s "|"
Bu, yerel ve uzak dalları ( -a
) ele alır, ayrılmış kafa durumunu (daha uzun sed komutu, çözüm bir tür kaba olsa da - sadece ayrılmış şube bilgisini HEAD anahtar sözcüğü ile değiştirir), taahhüt konusunu ekler (% s ) ve biçim dizesindeki değişmez boru karakterleri aracılığıyla ve son sonucu geçirerek bir şeyleri sütunlara koyar column -t -s "|"
. (Çıktının geri kalanında beklemediğiniz bir şey olduğu sürece ayırıcı olarak her şeyi kullanabilirsiniz.)
İkinci varyantım oldukça çirkin, ama dal komutunun yaptığı gibi hala "şu anda bulunduğunuz dal" göstergesi olan bir şey istedim.
CURRENT_BRANCH=0
for k in `git branch -a | sed -e 's/\*/CURRENT_BRANCH_MARKER/' -e 's/(detached from .*)/HEAD/'`
do
if [ "$k" == 'CURRENT_BRANCH_MARKER' ]; then
# Set flag, skip output
CURRENT_BRANCH=1
elif [ $CURRENT_BRANCH == 0 ]; then
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`
else
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset* %Cgreen$k%Creset |%s" $k --`
CURRENT_BRANCH=0
fi
done | sort | column -t -s "|"
Bu *
, geçerli dalı bir anahtar kelimeye dönüştürür ve döngü gövdesi anahtar kelimeyi gördüğünde bir bayrak ayarlar ve hiçbir şey çıkarmaz. Bayrak, sonraki satır için alternatif bir biçimlendirmenin kullanılması gerektiğini belirtmek için kullanılır. Dediğim gibi, tamamen hileli, ama işe yarıyor! (Çoğunlukla. Bazı nedenlerden dolayı, son sütunum geçerli şube satırında geride kalıyor.)
git for-each-ref
dalları işlemek için komut dosyası dostu bir yöntemdir. Geçerli dalı almak için sembolik ref'yi bir kez çalıştırmanız gerekir.
Basit bir takma ad yaptım, tam olarak sorduğumdan emin değilim, ama basit
Bunu yukarıdaki komutların sadece yerel şubelerimi değil tüm şubeleri listelemek istediğim için yaptım
alias git_brs="git fetch && git branch -av --format='\''%(authordate)%09%(authordate:relative)%09%(refname)'\'"
grep origin
Yalnızca orijinleri almak için yukarı yöneltebilirsiniz
Bu, tüm şubeleri değiştirilen son tarihle birlikte listeler, en son sürüm için hangisini çekmem gerektiğine karar vermeme yardımcı olur
Bu, aşağıdaki ekran tipiyle sonuçlanır
Wed Feb 4 23:21:56 2019 +0230 8 days ago refs/heads/foo
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/heads/master
Mon Feb 9 12:19:33 2019 +0230 4 days ago refs/heads/bar
Wed Feb 11 16:34:00 2019 +0230 2 days ago refs/heads/xyz
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/HEAD
Mon Feb 9 12:19:33 2019 +0230 4 days ago refs/remotes/origin/foo
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/master
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/bar
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/xyz
Yardım edersen bana haber ver, mutlu gitting
Veya PHP betiğimi kullanabilirsiniz, https://gist.github.com/2780984
#!/usr/bin/env php
<?php
$local = exec("git branch | xargs $1");
$lines = explode(" ", $local);
$limit = strtotime("-2 week");
$exclude = array("*", "master");
foreach ($exclude as $i) {
$k = array_search($i, $lines);
unset($lines[$k]);
}
$k = 0;
foreach ($lines as $line) {
$output[$k]['name'] = $line;
$output[$k]['time'] = exec('git log '.$line.' --pretty=format:"%at" -1');
if ($limit>$output[$k]['time']) {
echo "This branch should be deleted $line\n";
exec("git branch -d $line");
}
$k++;
}
?>
İşte bunu kolaylaştırmak için bash_profile'ınıza ekleyebileceğiniz bir işlev.
Git deposundayken kullanım:
branch
tüm yerel şubeleri yazdırırbranch -r
tüm uzak dalları yazdırırİşlev:
branch() {
local pattern="s/^..//"
local arg=""
if [[ $@ == "-r" ]]; then
pattern="s/^..(.*?)( ->.*)?$/\1/"
arg=" -r "
echo '-r provided'
fi
for k in $(git branch $arg | perl -pe "$pattern"); do
echo -e $(git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1)\\t$k
done | sort -r
}
PowerShell'de, aşağıdakiler uzaktan kumandada birleştirilmiş ve en az iki haftalık dalları gösterir ( author:relative
biçim iki haftadaki günler yerine haftalar görüntülenmeye başlar):
$safeBranchRegex = "origin/(HEAD|master|develop)$";
$remoteMergedBranches = git branch --remote --merged | %{$_.trim()};
git for-each-ref --sort='authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/remotes | ?{$_ -match "(weeks|months|years) ago" -and $_ -notmatch "origin/(HEAD|master|qa/)"} | %{$_.substring($_.indexof("origin/"))} | ?{$_ -in $remoteMergedBranches}