प्रत्येक शाखा और उसके अंतिम संशोधन की तिथि Git में सूचीबद्ध करना


138

मुझे हमारी दूरस्थ रिपॉजिटरी से पुरानी और बिना लाइसेंस वाली शाखाओं को हटाने की आवश्यकता है। मैं एक तरीका खोजने की कोशिश कर रहा हूं जिसके साथ दूरस्थ शाखाओं को उनकी अंतिम संशोधित तिथि तक सूचीबद्ध किया जा सके, और मैं नहीं कर सकता।

क्या इस तरह से दूरस्थ शाखाओं को सूचीबद्ध करने का एक आसान तरीका है?



3
इसका उत्तर: stackoverflow.com/questions/5188320/… यहाँ दिए गए उत्तरों से सभी बेहतर हैं
सॉफ्टवेयर इंजीनियर

जवाबों:


172

कमांडलाइनफू में 2 दिलचस्प प्रस्ताव हैं:

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

या:

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

यह स्थानीय शाखाओं के लिए है, यूनिक्स सिंटैक्स में। का उपयोग करते हुए git branch -r, आप इसी तरह दूरस्थ शाखाओं को दिखा सकते हैं:

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

माइकल फॉरेस्ट ने टिप्पणी में उल्लेख किया है कि zsh को sedअभिव्यक्ति के लिए पलायन की आवश्यकता है :

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 टिप्पणियों में जोड़ता है :

यदि आप इसे अपने zshrc से जोड़ना चाहते हैं तो निम्नलिखित भागने की आवश्यकता है।

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'

कई लाइनों में:

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'

नोट: n8tr का उत्तर , git for-each-ref refs/headsक्लीनर पर आधारित है। और तेज
यह भी देखें " नाम केवल विकल्प के लिए git branch --list? "

आमतौर पर, ट्रिपल हमें टिप्पणियों में याद दिलाता है :

  • आधुनिक $(command substitution)बैकटेक्स सिंटैक्स पर आधुनिक सिंटैक्स को प्राथमिकता दें ।

(मैंने 2014 में "बिंदु और शेल प्रोग्रामिंग में क्या अंतर है?$(command)`command` "


1
@ जेसेन जे: दिलचस्प है, है ना? यह स्टैक ओवरफ्लो ( codeinthehole.com/archives/… ) की सार्वजनिक रिलीज के कुछ महीनों बाद लॉन्च हुआ , और कुछ हद तक एसओ से प्रेरित था। यह भी देखें commandlinefu.com/commands/tagged/67/git ); अधिक Git commandlinefu के लिए
VonC

यह उत्तर स्टैकओवरफ्लो को जोड़ता है। पूछताछ / 5188320 /… का गधा। :)
स्पंदुन

@ एसबेस्टियन जी को यकीन नहीं है: यह अपने आप में एक अच्छा सवाल होगा।
VonC

+1 बहुत बढ़िया आप /jsonकिसी भी कमांडलाइनफू.कॉम URL के अंत में कैसे जोड़ सकते हैं और आपको JSON के रूप में सभी कमांड मिलेंगे।
नूह सुस्मान

1
@tripleee धन्यवाद। मैंने उत्तर को संपादित किया है और अधिक दृश्यता के लिए आपकी टिप्पणियों को शामिल किया है।
वॉन

121

यहाँ मेरा उपयोग है:

git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads

यह आउटपुट है:

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

दूरस्थ शाखाओं के लिए, "रेफ्स / हेड्स" के बजाय "रिफ्स / रिमॉसेस" का उपयोग करें:

git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/remotes

N8tr के उत्तर पर निर्माण , यदि आप शाखा के अंतिम लेखक में भी रुचि रखते हैं, और यदि आपके पास "कॉलम" उपकरण उपलब्ध है, तो आप इसका उपयोग कर सकते हैं:

git for-each-ref --sort='-committerdate:iso8601' --format='%(committerdate:relative)|%(refname:short)|%(committername)' refs/remotes/ | column -s '|' -t

जो आपको देगा:

21 minutes ago  refs/remotes/a        John Doe
6 hours ago     refs/remotes/b        Jane Doe
6 days ago      refs/remotes/master   John Doe

आप नवीनतम जानकारी के लिए "git fetch --prune" को कॉल करना चाहते हैं।


5
प्रत्येक-रेफरी और प्रारूप विकल्पों के लिए अच्छा उपयोग। +1। अपने स्वयं के उत्तर में मेरे द्वारा बताए गए आदेशों की तुलना में आसान लगता है।
VonC

2
थोड़ा ट्विक करना: ------- प्रत्येक के लिए git-प्रत्येक-रेफरी = sort = '- कोऑर्डिनेट: iso8601' --फॉर्मैट = '% (ऑक्टोर्डेट: रिलेटिव)% 09% (refname: short)' रिफ्स / हेड्स ------- आपको एक सापेक्ष तारीख देता है और
रेफ्स

1
जिन लोगों के लिए यह तुरंत स्पष्ट नहीं है, मुझे लगता है कि यह जानकारी दिखाता है। स्थानीय शाखाओं के लिए सख्ती।
hbrent

@ आप सही हैं, यह बिल्कुल सवाल का जवाब नहीं दिया। मैंने उसी के अनुसार अपना उत्तर संपादित किया है।
ओक्रोक्यूलेट

यह उन शाखाओं को क्रमबद्ध करता है और सूचीबद्ध करता है authordate(जो तब दिखाई देती है जब शाखा पहली बार बनाई गई थी?)। यदि आप बदलते authordateहैं committerdateतो आपको प्रत्येक शाखा में सबसे हाल की प्रतिबद्ध तारीखें दिखाई देंगी। जैसे:git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
लोगन बेसेकर

23

ओलिवियर क्रॉकेट का निर्माण , मुझे एक सापेक्ष तिथि का उपयोग करना और इस तरह शाखा का नाम छोटा करना पसंद है:

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

जो आपको आउटपुट देता है:

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

मैं आपके सभी पसंदीदा उपनाम जोड़ने और फिर आपकी टीम को स्क्रिप्ट साझा करने के लिए बैश फ़ाइल बनाने की सलाह देता हूं। यहाँ सिर्फ एक को जोड़ने के लिए एक उदाहरण दिया गया है:

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

तो फिर तुम सिर्फ एक अच्छी तरह से स्वरूपित और स्थानीय शाखा सूची को क्रमबद्ध करने के लिए ऐसा कर सकते हैं:

git branches

20

बस @VCC द्वारा टिप्पणी में जोड़ने के लिए, अपना पसंदीदा समाधान लें और सुविधा के लिए इसे अपनी ~ / .ITconfig उपनाम सूची में जोड़ें:

[alias]  
    branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'

फिर एक सरल "गिट ब्रांचडेट" आपके लिए सूची प्रिंट करता है ...


3
+1 को .gitconfig के साथ उपयोग करने का तरीका दिखाने के लिए! इसके अलावा fwiw मैंने प्रारूप स्ट्रिंग को बदल दिया है: --format='%(authordate)%09%(objectname:short)%09%(refname)'जो प्रत्येक शाखा के लघु हैश को भी प्राप्त करता है।
नूह सूसन

अच्छा लगा। मैं "tac" को अंत तक जोड़ना चाहूंगा ताकि इसे रिवर्स ऑर्डर में क्रमबद्ध किया जा सके ताकि हाल ही में छपी शाखाएं जल्दी से दिखाई दें।
बेन

1
आप की जरूरत नहीं है | tac, बस --sort='authordate'के बजाय-authordate
क्रिस्ट्यन

4

यहाँ है कि मैं क्या करने के बाद भी समीक्षा करने के साथ आया है इस

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जांच डुप्लिकेट को निकालने के अगर एक ही करने के लिए एक से अधिक शाखा अंक के लिए प्रतिबद्ध है। (जैसा कि एक स्थानीय शाखा में है जो रिमोट में भी मौजूद है।)

ध्यान दें कि ओपी अनुरोध के अनुसार, git branch --mergedऔर git branch --no-mergedयह पहचानने में उपयोगी है कि किन शाखाओं को आसानी से हटाया जा सकता है।

[ https://git-scm.com/docs/git-branch]


3

क्रमबद्ध किया गया दूरस्थ शाखाओं और आखिरी प्रत्येक शाखा के लिए तारीख के लिए प्रतिबद्ध।

for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r

1
रिमोट के बारे में ओपी सवाल का जवाब देने के लिए धन्यवाद।
आर्केल्डन

1

मैंने VonC के उत्तर के आधार पर, दो संस्करण बनाए ।

मेरा पहला संस्करण:

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 "|"

यह स्थानीय और दूरस्थ शाखाओं ( -a) को संभालता है, अलग-थलग स्थिति को संभालता है (लंबी sed कमांड, हालांकि समाधान क्रूड की तरह है - यह केवल कीवर्ड के साथ अलग शाखा जानकारी को बदल देता है), प्रतिबद्ध विषय में जोड़ता है (% s) ), और प्रारूप स्ट्रिंग में शाब्दिक पाइप पात्रों के माध्यम से कॉलम में चीजों को डालता है और अंतिम परिणाम को पास करता है column -t -s "|"। (आप विभाजक के रूप में उपयोग कर सकते हैं, जब तक कि यह ऐसा कुछ है जो आप बाकी आउटपुट में उम्मीद नहीं करते हैं।)

मेरा दूसरा वैरिएंट काफी हैक है, लेकिन मैं वास्तव में कुछ ऐसा चाहता था जिसमें अभी भी "यह वह शाखा है जिस पर आप वर्तमान में हैं" जैसा कि शाखा कमांड करता है।

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 "|"

यह *वर्तमान शाखा को कीवर्ड में बदल देता है, और जब लूप बॉडी कीवर्ड को देखता है तो इसके बजाय एक ध्वज सेट करता है और कुछ भी आउटपुट नहीं करता है। ध्वज का उपयोग यह इंगित करने के लिए किया जाता है कि अगली पंक्ति के लिए एक वैकल्पिक स्वरूपण का उपयोग किया जाना चाहिए। जैसा मैंने कहा, यह पूरी तरह से हैक है, लेकिन यह काम करता है! (अधिकतर। किसी कारण से, मेरा पिछला कॉलम वर्तमान शाखा लाइन पर पार हो रहा है।)


दुर्भाग्य से VonCs के उत्तर की जानकारी स्क्रिप्टिंग के लिए बहुत अच्छी नींव नहीं है। यहाँ देखें git-blame.blogspot.com/2013/06/…
एंड्रयू सी

हम्म। यह वर्तमान शाखा का नाम पाने के लिए एक रास्ता दिखाता है, अगर इसका कोई नाम है। क्या शाखाओं की मशीन-अनुकूल सूची प्राप्त करने का एक [पसंदीदा] तरीका है? (और वर्तमान शाखा को अलग करने का कोई तरीका, या तो उस आउटपुट से सीधे या किसी तरह git पूछकर "क्या यह HEAD जैसा है?")
benkc

git for-each-refप्रसंस्करण शाखाओं की स्क्रिप्ट के अनुकूल तरीका है। आपको वर्तमान शाखा प्राप्त करने के लिए प्रतीकात्मक-रेफ को एक बार चलाना होगा।
एंड्रयू सी

प्रयास के लिए +1, लेकिन यह वास्तव में मेरा एक पुराना उत्तर था । stackoverflow.com/a/16971547/6309 या (अधिक पूर्ण) stackoverflow.com/a/19585361/6309 में कम 'sed' शामिल हो सकता है।
VonC

1

मैंने एक साधारण उर्फ ​​किया, यकीन नहीं होता कि क्या यह वास्तव में पूछा जाता है, लेकिन यह सरल है

मैंने ऐसा किया था क्योंकि मैं सभी शाखाओं को न केवल मेरी स्थानीय शाखाओं को सूचीबद्ध करना चाहता था, जो कि ऊपर की कमांड केवल करती हैं

alias git_brs="git fetch && git branch -av --format='\''%(authordate)%09%(authordate:relative)%09%(refname)'\'"

आप ऊपर पाइप कर सकते हैं grep origin केवल मूल प्राप्त लिए

यह संशोधित की गई अंतिम तिथि के साथ सभी शाखाओं को सूचीबद्ध करता है, मुझे यह तय करने में मदद करता है कि मुझे कौन सा नवीनतम संस्करण के लिए खींचना चाहिए

यह प्रदर्शन के नीचे प्रकार में परिणाम है

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

कोशिश करो और मुझे पता है अगर यह मदद की, खुश gitting


अच्छा और सरल। कोई विशेष सॉस नहीं।
श्रीमानस

0

या आप मेरी PHP स्क्रिप्ट, 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++;
    }
?>

0

यहां एक फ़ंक्शन है जिसे आप अपने bash_profile में जोड़ सकते हैं ताकि यह आसान हो सके।

Git भंडार में उपयोग करने पर:

  • branch सभी स्थानीय शाखाओं को प्रिंट करता है
  • branch -r सभी दूरस्थ शाखाओं को प्रिंट करता है

समारोह:

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
}

0

PowerShell में, निम्नलिखित रिमोट पर शाखाएं दिखाता है जो पहले से ही विलय हो चुकी हैं और कम से कम दो सप्ताह पुरानी हैं ( author:relativeप्रारूप दो सप्ताह में दिनों के बजाय सप्ताह प्रदर्शित करना शुरू करता है):

$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}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.