গিতে প্রতিটি শাখা এবং এর শেষ সংশোধনের তারিখ তালিকাভুক্ত করা হচ্ছে


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)অপ্রচলিত ব্যাকটিক সিনট্যাক্সের চেয়ে আধুনিক সিনট্যাক্সকে পছন্দ করুন ।

(আমি " শেল প্রোগ্রামিং এবং এর মধ্যে পার্থক্য কী ?$(command)`command` " দিয়ে ২০১৪ সালের সেই বিন্দুটি চিত্রিত করেছি )


1
@ হানসেন জে: আকর্ষণীয়, তাই না? এটি স্ট্যাক ওভারফ্লো ( কোডিনথেহোল.com / archives/… ) প্রকাশের কয়েক মাস পরে চালু হয়েছিল এবং কিছুটা এসও দ্বারা অনুপ্রাণিত হয়েছিল। আরও দেখুন commandlinefu.com/commands/tagged/67/git ); আরো Git commandlinefu জন্য
VonC

এই উত্তরটি স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৫৮৮৮৮০২০ / এর গাধাটিকে কিক করে দেয় । :)
স্পানডুন

@ সেবাস্তিয়ানজি নিশ্চিত নন: এটি তার নিজস্ব একটি ভাল প্রশ্ন হবে।
ভোনসি

/jsonআপনি যে কোনও কমান্ডলাইনফু.কম ইউআরএল এর শেষের দিকে যুক্ত করতে পারেন এবং আপনি JSON হিসাবে সমস্ত কমান্ড পাবেন will
নোহ সুসমান

1
@ ট্রিপলি আপনাকে ধন্যবাদ আমি উত্তরটি সম্পাদনা করেছি এবং আরও দৃশ্যের জন্য আপনার মন্তব্যগুলি অন্তর্ভুক্ত করেছি।
ভনসি

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

এন 8 টির উত্তরের ভিত্তিতে , আপনি যদি শাখার শেষ লেখকের প্রতি আগ্রহীও হন এবং আপনার যদি "কলাম" সরঞ্জাম উপলব্ধ থাকে তবে আপনি ব্যবহার করতে পারেন:

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

সর্বশেষ তথ্য পাওয়ার আগে আপনি "গিট ফেচ - প্রুন" কল করতে চাইতে পারেন।


5
প্রতিটি-রেফের জন্য দুর্দান্ত ব্যবহার এবং ফর্ম্যাট বিকল্পগুলি। +1 টি। আমি নিজের উত্তরে যে কমান্ডগুলি উল্লেখ করেছি তার চেয়ে সহজ মনে হচ্ছে।
ভোনসি

2
সামান্য টুইট করছি: ------- গিটারের জন্য-প্রতিটি-রেফ --sort = '- লেখক: iso8601' --format = '% (লেখক: আপেক্ষিক)% 09% (পুনঃনামকরণ: সংক্ষিপ্ত)' রেফ / মাথা ------- আপনাকে আপেক্ষিক তারিখ দেয় এবং
রেফগুলি

1
যাদের কাছে এটি অবিলম্বে সুস্পষ্ট নয়, আমি মনে করি এটি তথ্য প্রদর্শন করে। স্থানীয় শাখার জন্য কঠোরভাবে।
hBrent

@ 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

@VonC- এর মন্তব্যে কেবল যুক্ত করতে, আপনার পছন্দসই সমাধানটি নিন এবং সুবিধার্থে এটি আপনার ~ / .gitconfig ওরফে তালিকায় যুক্ত করুন:

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

তারপরে একটি সাধারণ "গিট ব্রাঞ্চডেট" আপনার জন্য তালিকাটি মুদ্রণ করে ...


3
এটি .gitconfig দিয়ে কীভাবে ব্যবহার করবেন তা দেখানোর জন্য +1! এছাড়াও fww আমি ফর্ম্যাট স্ট্রিং এ পরিবর্তন করে: --format='%(authordate)%09%(objectname:short)%09%(refname)'যা প্রতিটি শাখা সংক্ষিপ্ত হ্যাশ পায়।
নোহ সুসমান

খুশী হলাম। এটিকে বিপরীত ক্রমে সাজানোর জন্য আমি শেষে "| ট্যাক" যুক্ত করব যাতে সম্প্রতি স্পর্শ করা শাখাগুলি দ্রুত দৃশ্যমান হয়।
বেন

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কোন শাখা সহজে মুছে ফেলা যায় তা সনাক্ত করতে কার্যকর in

[ 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

ভনসির উত্তরের ভিত্তিতে আমি দুটি বৈকল্পিক তৈরি করেছি ।

আমার প্রথম রূপ:

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পরিচালনা করে ( ), বিচ্ছিন্ন-মাথা অবস্থিতি (লম্বা সেড কমান্ড, যদিও সমাধানটি একধরণের ক্রুড - এটি কেবল বিচ্ছিন্ন শাখার তথ্যকে মূলশব্দ হেডের সাথে প্রতিস্থাপন করে), কমিট সাবজেক্টে যুক্ত করে (% 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 "|"

এটি *বর্তমান শাখাকে কীওয়ার্ড হিসাবে চিহ্নিত করে এবং লুপের বডি কীওয়ার্ডটি দেখলে পরিবর্তে এটি একটি পতাকা সেট করে এবং কিছুই আউটপুট করে। পতাকাটি চিহ্নিত করতে ব্যবহৃত হয় যে পরের লাইনের জন্য বিকল্প বিন্যাস ব্যবহার করা উচিত। আমি যেমন বলেছিলাম, এটি সম্পূর্ণ হ্যাকি, তবে এটি কার্যকর! (বেশিরভাগ ক্ষেত্রে। কিছু কারণে, আমার শেষ কলামটি বর্তমান শাখার লাইনে ছড়িয়ে পড়েছে))


দুর্ভাগ্যক্রমে ভনসির উত্তরের তথ্য স্ক্রিপ্টিংয়ের জন্য দুর্দান্ত ভিত্তি নয়। এখানে git-blame.blogspot.com/2013/06/…
অ্যান্ড্রু সি

হুম। এটি বর্তমান শাখার নাম রাখার উপায় দেখায়, যদি এর নাম থাকে। কোন শাখার জন্য মেশিন বান্ধব তালিকা পাওয়ার কোনও [পছন্দসই] উপায় আছে? (এবং বর্তমান শাখার পার্থক্য করার কিছু উপায়, হয় সেই আউটপুট থেকে সরাসরি বা কোনওভাবে গিট জিজ্ঞাসা করে "এই কি শিরোনামের মতো একই রেফ?")
বেনকসি

git for-each-refপ্রক্রিয়া শাখার স্ক্রিপ্ট-বান্ধব উপায় way বর্তমান শাখাটি পেতে আপনাকে একবার প্রতীকী-রেফ চালাতে হবে।
অ্যান্ড্রু সি

প্রয়াসের জন্য +1, তবে এটি ছিল আমার পুরানো উত্তর। stackoverflow.com/a/16971547/6309 বা (আরও সম্পূর্ণ) স্ট্যাকওভারফ্লো.com/a/19585361/6309 কম 'শেড' জড়িত থাকতে পারে।
ভনসি

1

আমি একটি সাধারণ ওরফে করেছি, এটি ঠিক জিজ্ঞাসা করা হয়েছে কিনা তা নিশ্চিত নই, তবে এটি সহজ

আমি এটি করেছি কারণ আমি সমস্ত শাখা তালিকাভুক্ত করতে চেয়েছিলাম কেবল আমার স্থানীয় শাখা নয়, যা উপরের আদেশগুলি কেবলমাত্র করে do

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

অথবা আপনি আমার পিএইচপি স্ক্রিপ্ট, 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

এটিকে আরও সহজ করতে আপনি নিজের বাশ_প্রফাইলে যুক্ত করতে পারেন এমন একটি ফাংশন এখানে।

গিট সংগ্রহস্থলে থাকাকালীন ব্যবহার:

  • 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

পাওয়ারশেলে, নীচেরগুলি রিমোটের শাখাগুলি দেখায় যা ইতিমধ্যে মার্জ হয়েছে এবং কমপক্ষে দুই সপ্তাহ পুরাতন ( 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}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.