সাম্প্রতিক কমিট দ্বারা আদেশ করা গিট শাখার একটি তালিকা আমি কীভাবে পেতে পারি?


1322

আমি শীর্ষস্থানীয় "সর্বাধিক" শাখার সাথে গীট সংগ্রহস্থলের সমস্ত শাখার একটি তালিকা পেতে চাই, যেখানে "সর্বাধিক" শাখাটি সর্বাধিক সম্প্রতি প্রতিশ্রুতিবদ্ধ হয়েছে (এবং তাই, সম্ভবত এক হওয়ার সম্ভাবনা রয়েছে) আমি মনোযোগ দিতে চাই)।

আমি (গ) সর্বশেষ প্রতিশ্রুতি দ্বারা শাখাগুলির তালিকা বাছাই করতে বা (খ) একের মেশিন-পঠনযোগ্য ফর্ম্যাটে, প্রত্যেকের শেষ-প্রতিশ্রুতি তারিখের সাথে শাখার একটি তালিকা পেয়ে গিট ব্যবহার করার কোন উপায় আছে কি?

সবচেয়ে খারাপ ক্ষেত্রে, আমি সবসময় git branchসমস্ত শাখার একটি তালিকা পেতে, তার আউটপুটকে বিশ্লেষণ git log -n 1 branchname --format=format:%ciকরতে এবং তারপরে প্রত্যেকটির জন্য, প্রতিটি শাখার অঙ্গীকারের তারিখ পেতে দৌড়াতে পারি । তবে এটি একটি উইন্ডোজ বাক্সে চলবে, যেখানে একটি নতুন প্রক্রিয়া স্পিনিং করা তুলনামূলকভাবে ব্যয়বহুল, সুতরাং শাখা প্রতি একবার গিট এক্সিকিউটেবল চালু করা যদি প্রচুর শাখা থাকে তবে ধীরে ধীরে আসতে পারে। একটি একক আদেশ দিয়ে এই সব করার কোন উপায় আছে?


2
stackoverflow.com/a/2514279/1804124 এর আরও ভাল উত্তর রয়েছে।
স্পানডুন

12
@ স্পুনডুন, আপনি আমাকে সেখানে হারিয়েছেন। পার্ট এবং সেডের মাধ্যমে পাইপযুক্ত স্টাফ সহ একাধিক কমান্ডের সংমিশ্রণটি কীভাবে গিটের ইতিমধ্যে রয়েছে এমন কমান্ড ব্যবহার করার চেয়ে "ভাল"?
জো হোয়াইট

36
জাকুব নারাবস্কির উত্তর সম্পর্কে @ স্পুনডুন git for-each-ref: আপনি প্রত্যন্ত শাখাগুলির refs/remotes/পরিবর্তে refs/heads/পাস করতে পারেন (অথবা আপনি উভয়কেই হোয়াইটস্পেসে পৃথক করতে পারবেন); refs/tags/ট্যাগের জন্য, বা কেবল refs/তিনটি ধরণের জন্য।
jakub.g

4
গিট 2.7 (Q4 2015) শুরু হচ্ছে, আর নেই for-each-ref! আপনি সরাসরি ব্যবহার করবেন git branch --sort=-committerdate: আমার উত্তর নীচে দেখুন
ভনক

উত্তর:


1873

এর --sort=-committerdateবিকল্পটি ব্যবহার করুন git for-each-ref;

পাওয়া যায় এছাড়াও গীত 2.7.0 যেহেতু জন্য git branch:

প্রাথমিক ব্যবহার:

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

ফলাফল:

ফলাফল

উন্নত ব্যবহার:

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

ফলাফল:

ফলাফল


15
পারফেক্ট! এমনকি আউটপুটটি কেবলমাত্র রেফ নামগুলিতে সংযোজন করে সীমাবদ্ধ করতে পারি --format=%(refname)
জো হোয়াইট

35
এটি আমার পক্ষে আরও ভাল:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
সাeedদগ্নু

2
@ মিলিয়াস: কেন ব্যবহার :shortnameকরবেন না ?
জাকুব নরবস্কি

37
@ilius: হিসাবে @BeauSmith লিখেছিলেন: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/। গিট-ফর-প্রতিটি-রেফ (1) ম্যানপেজ বলেছেন: রেফ সংযোজনের একটি অ-দ্বিপাক্ষিক সংক্ষিপ্ত নামের জন্য :short
জাকুব নরবস্কি

76
এটি হ্যাশ, বার্তা, প্রতি শাখায় শেষ কমিটের আপেক্ষিক বয়স সহ কমিটের তারিখের ভিত্তিতে আরোহণের আদেশ সহ একটি বর্ণযুক্ত সংস্করণ। আমি উপরের ছেলেদের কাছ থেকে সমস্ত ধারণাটি চুরি করেছি। এটি [alias]বিভাগে আমার .gitconfig এ আছে এবং আমি এটি পছন্দ করি। br = for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
মাইকেল পার্সি

124

সাম্প্রতিক কমিট দ্বারা আদেশ করা গিট শাখার নামগুলির তালিকা…

জাকুবের জবাব এবং জোয়ের টিপকে প্রসারিত করে , নিম্নলিখিতগুলি "রেফ / মাথা /" বের করে দেবে যাতে আউটপুট কেবল শাখার নামগুলি প্রদর্শন করে:


COMMAND:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

ফলাফল:

সাম্প্রতিক গিট শাখা


4
আপনি --format=%(refname:short)নির্ভর করার পরিবর্তে ব্যবহার করতে পারেন cut
চৈতন্য গুপ্ত

3
রিমোট সংগ্রহস্থলের জন্য এটি করার কোনও উপায় আছে কি?
অ্যালান বোউ

10
আঃ - @ জাকুব.আর ইতিমধ্যে ব্যাখ্যা করেছেন: আপনি রিফ / হেড / এর পরিবর্তে প্রত্যন্ত শাখাগুলি রেফ / রিমোটগুলি / পাস করতে পারেন। পারফেক্ট !!
অ্যালান বোউ

আমি git rbgit config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
এইটিকে

2
এবং এখন আপনি এটি দিয়ে এটি করতে পারেন git branch, তাই স্থানীয়, দূরবর্তী বা সমস্ত শাখা পাওয়া গিট-শাখার মতো কাজ করে (যেমন -আর, -এ)। git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
ফোর্ড

89

এখানে সর্বোত্তম কোড, যা অন্য দুটি উত্তরকে একত্রিত করে:

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

10
এমনকি একটি git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
সারণী

2
কোনও কারণে আমাকে উইন্ডোজে ডাবল-কোট ব্যবহার করতে হয়েছিল, তবে অন্যথায় এগুলি
ঠিকঠাক

1
@ সকোয়েতবি এই কোডটি নিকোলয়ের মতো দেখতে হ'ল, আপনি এটিকে সারণী করতে কী পরিবর্তন করেছেন?
এনরিকো

@ এরিকো এবং অন্যান্যরাও একই জিনিস সম্পর্কে অবাক হতে পারে। নিকোলে স্কোয়েটবিস পরামর্শ ব্যবহার করে তার উত্তর পরিবর্তন করে changed সর্বদা একই দৈর্ঘ্যের তারিখটি সরানোর পরে ফলাফলটি আরও সারণী বলে মনে হয়।
জনি

83

এখানে একটি সহজ কমান্ড যা সর্বশেষ কমিট সহ সমস্ত শাখা তালিকাভুক্ত করে:

git branch -v

সাম্প্রতিক কমিট দ্বারা অর্ডার করতে, ব্যবহার করুন

git branch -v --sort=committerdate

সূত্র: http://git-scm.com/book/en/Git- ব্র্যাঞ্চিং- ব্র্যাঞ্চ- ব্যবস্থাপনা


11
git branch -avযদি আপনি অ-স্থানীয় শাখাও দেখতে চান।
স্কট স্টাফোর্ড

34
এটি প্রশ্ন অনুসারে কমিটের তারিখ অনুসারে বাছাই করে না।
কেস

1
git branch -vতালিকাভুক্ত প্রতিটি কমিটের তারিখ অন্তর্ভুক্ত করা কি সহজ ?
ডুম্বলডেড

1
<pre> গিট শাখা -v --sort = প্রতিশ্রুতিবদ্ধ </ translation> কীভাবে?
ইরজ জেলোডারি

2
এটা সত্যিই দারুন. আমি git branch -va --sort=-committerdateশীর্ষে সর্বাধিক পরিবর্তিত শাখাগুলি সহ অ-স্থানীয় শাখাগুলি দেখাতে চাই ।
ক্লিনটন ব্ল্যাকমোর

61

আমি নিম্নলিখিত নামটি ব্যবহার করি:

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

যা উত্পাদন করে:

ফলাফল

'|' ব্যবহার করুন ভাগ করা, বিভক্ত করা.


1
দুর্দান্ত ওরফে! column -ts'|'কমা চরটি যদি আপনার লোকালে আপেক্ষিক টাইমস্ট্যাম্পের ভিতরে আসতে পারে তবে আমি প্রস্তাব করব এবং অক্ষরগুলি পাইপ করব।
বিজন লিন্ডকভিস্ট

1
দুর্দান্ত ওরফে, আপনাকে অনেক ধন্যবাদ অন্য রঙের সাথে বা শুরুতে * দিয়ে বর্তমান শাখাটি প্রদর্শন করতে আপনি কী এটি উন্নত করতে পারেন?
এলাহাদি ডিপি ıpɐɥ ן ǝ

2
কমপক্ষে গিটের সর্বশেষতম সংস্করণে আপনি কমান্ডটি '%(HEAD) ...'পাইপ না করে একই প্রভাব পেতে ফর্ম্যাট স্ট্রিংয়ের শুরুতে যোগ করতে পারেনsed
জোশুয়া স্ক্রাজিপেক

5
আমি এই গিটটি ওরফে হিসাবে কাজ করতে পারি না। আমাকে ব্যবহার করতে হয়েছিল[alias] recent = !git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'
ওয়েসলি স্মিথ

11
রঙ পেতে আমাকে সর্বদা --color = যুক্ত করতে হয়েছিল। git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always|column -ts'|'}
ব্যবহারকারী3342930

40

আমার জন্য সর্বোত্তম কাজ করে এমন কিছু তৈরি করতে আমি পূর্ববর্তী উদাহরণগুলি উল্লেখ করতে সক্ষম হয়েছি।

প্রতিটি-রেফের জন্য গিট - সর্ট = -কমিটরডেট রেফ / হেডস - - ফর্ম্যাট = '% (লেখক: সংক্ষিপ্ত)% (বর্ণ: লাল)% (বস্তুর নাম: সংক্ষিপ্ত)% (রঙ: হলুদ)% (পুনঃনাম: সংক্ষিপ্ত) )% (রঙ: রিসেট) (% (রঙ: সবুজ)% (প্রতিশ্রুতিবদ্ধ: আপেক্ষিক)% (রঙ: রিসেট)) '

আউটপুট এর স্ক্রিনশট


1
আমি স্ট্যাকওভারফ্লো . com/a/33163401/6309 এ পরামর্শ দিয়েছিলাম বলে সরাসরি গিট শাখা ব্যবহার করার চেয়ে এটি দেখতে সুন্দর, আরও রঙিন । +1
ভনসি

2
এই একজন আমার জন্য বাক্সটির বাইরে কাজ করেছিল, অন্য কারওর মতো নয়, তাই আমি এটির পক্ষে ভোট দিয়েছি।
কেসি

1
সত্যই সুন্দরভাবে কাজ করেছে! ধন্যবাদ! :-)
ফ্রোজেন টারজান

1
ডিট্টো - এই আমি বাকী থেকে কাজ করেছিলাম, অন্য আমি চেষ্টা করেছি এমন অনেকের বিপরীতে। ধন্যবাদ।
ড্যান নিসেনবাউম

2
এই এক পরিষ্কার এবং ঝরঝরে। একসময় আমি এটিকে হিসাবে দূরবর্তী এবং লেখক নামটি যুক্ত করতাম: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'

38

আমারও কোনও নকল ছাড়াই রঙ, ট্যাগ এবং দূরবর্তী রেফারেন্সের প্রয়োজন ছিল:

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

যেহেতু উদ্ধৃতি দেওয়া শক্ত হতে পারে, এখানে বাশের জন্য উপনাম রয়েছে:

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

$ <আপনার কমান্ড এখানে> অজানা: 1 লাইনের নিকটে সিনট্যাক্স ত্রুটি: 1 লাইনের নিকটে জামিন দেওয়া
জেমি মেসন

@ গোটনোসগারবাবি আপনি উদাহরণটির মতো একক উদ্ধৃতি ব্যবহার করছেন? আপনি কোন শেল ব্যবহার করছেন? বাশ সেই চরিত্রটিকে অন্য একটি বিশেষ অর্থ দেয়।
ইস্তানী

ওহে, আমি এটি / বিন / ব্যাশে চালিয়েছি (জিএনইউ ব্যাশ, সংস্করণ 4.0.28 (1) -আপনার উদাহরণের একটি সরল অনুলিপি এবং পেস্ট দিয়ে রিরিজ (i386-পিসি-সোলারিস 2.11) - তবে তখন থেকে আমি চালিয়েছি এটি অন / বিন / ব্যাশ (জিএনইউ ব্যাশ, সংস্করণ 3.2.48 (1) -রিলিজ (x86_64-আপেল-ডারউইন 12) এবং এটি কাজ করে, তাই আমি ডাউন-ভোটটি সরিয়ে দেব। অনেক অনেক ইস্তানী ধন্যবাদ।
জেমি ম্যাসন

@ গোটনোসগারবাবি আমি ৪.২.২৫ (1) -রিলেজ (x86_64-pc-linux-gnu) নাদ 3.x এ চেষ্টা করেছি এবং কাজ করেছি। আমি নিশ্চিত না যে এটি কী সমস্যা ছিল ... তবে এটি কোনও গ্যাশের পরিবর্তে গিট সংস্করণ সম্পর্কিত সমস্যাটি বেন করতে পারে। যাই হোক না কেন, আমি আনন্দিত এটি আপনার জন্য কাজ করে!
এস্তানি

1
@ মিশেলডিসেনজা কেবল সবকিছুই মাথা ঠেকানোর চেষ্টা করুন। যে | head -n20শেষে যুক্ত করা হবে। আপনি যদি উপনামটি ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে এটি উদ্ধৃতিগুলির মধ্যে চলেছে।
ইস্তানী

24

অন্যান্য উত্তরগুলি -vvভারবস আউটপুট পেতে পাস করার অনুমতি দেয় বলে মনে হয় না ।

সুতরাং এখানে একটি ওয়ান-লাইনার রয়েছে যা কমিটের git branch -vvতারিখ অনুসারে বাছাই করে রঙ ইত্যাদি সংরক্ষণ করে:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

আপনি যদি অতিরিক্তভাবে কমিটের তারিখ মুদ্রণ করতে চান তবে আপনি পরিবর্তে এই সংস্করণটি ব্যবহার করতে পারেন:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

নমুনা আউটপুট:

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

এটি সম্ভবত একাধিক লাইনে আরও পঠনযোগ্য বিভক্ত:

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

এটি অন্যান্য যুক্তিগুলির সাথেও কাজ করা উচিত git branch, যেমন -vvrদূরবর্তী ট্র্যাকিং শাখাগুলি তালিকাবদ্ধ করতে, বা -vvaদূরবর্তী ট্র্যাকিং এবং স্থানীয় শাখা উভয়কেই তালিকাবদ্ধ করতে।


-vvধন্যবাদ, সত্যিই দরকারী হতে পারে। যাইহোক, এই সমাধানটি এখনও প্রতিটি শাখার জন্য নতুন প্রক্রিয়া তৈরি করে, যা ওপি এড়াতে চেয়েছিল।
মুসফিল

আসলে git branchবিশেষভাবে অর্থ সংজ্ঞায়িত না -vv, কিন্তু শুধুমাত্র এর -v, তাই -vvহিসাবে একই থাকতে হবে -v
মুসিফিল

2
এটিই সর্বোত্তম. এবং অ্যাভিভি যোগ করার ফলে এটি দূরবর্তী শাখাগুলিকেও আমলে নিতে পারে। এর জন্য ধন্যবাদ!
গোফেরখান

@ মুসিফিল আমার গিট শাখা ম্যানপেজ , বিভাগে -v, -vv, --verboseনিম্নলিখিতটি রয়েছে:If given twice, print the name of the upstream branch, as well
পেরিলিওন

@ পার্লিয়োন: আমি জানি না কীভাবে আমি এই তথ্য পেয়েছি তবে আপনি ঠিক বলেছেন, এবং আমি সংশোধন করে দাঁড়িয়েছি stand ধন্যবাদ!
মুশিফিল

23

Git 2.7 (Q4 ই 2015) শাখা সরাসরি ব্যবহার বাছাই পরিচয় করিয়ে দিতে হবে git branch:
দেখুন কমিট aa3bc55 , aedcb7d কমিট , কমিট 1511b22 , কমিট f65f139 , ... (23 সেপ্টেম্বর 2015), aedcb7d কমিট , কমিট 1511b22 , ca41799 কমিট (24 সেপ্টেম্বর 2015) এবং অঙ্গীকার f65f139 , ... (23 সেপ্টেম্বর 2015) কার্তিক নায়ক ( KarthikNayak) দ্বারা
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 7f11b48 , 15 অক্টোবর 2015)

বিশেষত, aedcb7d কমিট করুন :

branch.c: ' ref-filter' এপিআই ব্যবহার করুন

রেফ বাছাইয়ের মাধ্যমে পুনরাবৃত্তির জন্য ' branch.c' ব্যবহার ' ref-filter' এপিআই তৈরি করুন । এটি branch.c' ref-filter' লাইব্রেরিতে কলগুলির পরিবর্তে ' ' 'র ব্যবহৃত কোডের বেশিরভাগ সরিয়ে দেয় ।

এটি বিকল্প যোগ করে--sort=<key> :

প্রদত্ত কীটির ভিত্তিতে বাছাই করুন। মানের ক্রমবর্ধমান ক্রম অনুসারে বাছাই করার
উপসর্গ -

আপনি --sort=<key>একাধিকবার বিকল্পটি ব্যবহার করতে পারেন , সেক্ষেত্রে শেষ কীটি প্রাথমিক কী হয়ে যায়।

সমর্থিত কীগুলি যেমন রয়েছে তেমনgit for-each-ref
সম্পূর্ণ পুনর্নবীকরণের উপর ভিত্তি করে অর্ডার ডিফল্ট বাছাই করুন ( refs/...উপসর্গ সহ )। এই তালিকাটি প্রথমে হেডকে (যদি উপস্থিত থাকে) প্রথমে, তারপরে স্থানীয় শাখা এবং শেষ পর্যন্ত দূরবর্তী ট্র্যাকিং শাখাগুলি তালিকাবদ্ধ করে।

এখানে:

git branch --sort=-committerdate 

বা (গিট 2.19 এর সাথে নীচে দেখুন)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

কার্তিক নায়ক ( ) দ্বারা 9e46833 (30 অক্টোবর 2015) প্রতিশ্রুতিবদ্ধও দেখুন । সহায়তায়: জুনিও সি হামানো ( )(দ্বারা একীভূত junio সি Hamano - - মধ্যে 415095f কমিট , 03 নভেম্বর 2015)KarthikNayak
gitster
gitster

সংখ্যাসূচক মান অনুসারে বাছাই করার সময় (উদাঃ --sort=objectsize) যখন উভয় রেফ একই মান রাখে তখন কোনও ফলব্যাক তুলনা হয় না। জোহানেস সিক্সট ( man gmane / 280117 ) দ্বারা নির্দেশিত হিসাবে এটি অপ্রত্যাশিত ফলাফলের (অর্থাত্ সমান মান সহ রেফের তালিকাটি পূর্ব নির্ধারিত হতে পারে না) কারণ হতে পারে ।

তাই, বর্ণানুক্রমিক refname যখনই অন্যান্য নির্ণায়ক সমান উপর ভিত্তি করে তুলনা ফলব্যাক

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

গিট 2.19 এর সাথে, সাজানোর ক্রমটি ডিফল্টরূপে সেট করা যায়।
git branchকনফিগ সমর্থন branch.sort, মত git tag, যা ইতিমধ্যে একটি কনফিগ ছিল tag.sort
দেখুন 560ae1c কমিট দ্বারা (16 আগস্ট 2018) স্যামুয়েল Maftoul ( ``)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে d89db6f কমিট , 27 আগস্ট 2018)

branch.sort:

এই পরিবর্তনশীল দ্বারা প্রদর্শিত যখন শাখাগুলি বাছাই ক্রম নিয়ন্ত্রণ করে git-branch
" --sort=<value>" বিকল্প সরবরাহ না করে এই ভেরিয়েবলের মান ডিফল্ট হিসাবে ব্যবহৃত হবে।


দূরবর্তী শাখা তালিকাবদ্ধ করতে, ব্যবহার করুন git branch -r --sort=objectsize-rসেটির উপরে ফ্ল্যাগ লাগাতে স্থানীয় শাখা এর পরিবর্তে দূরবর্তী শাখা তালিকা ঘটায়।


গিট 2.27 (কিউ 22020) দিয়ে, " git branch" এবং অন্যান্য " for-each-ref" রূপগুলি --sort=<key>বর্ধমান ক্রমের ক্ষেত্রে একাধিক বিকল্প গ্রহণ করেছে, তবে এটি --ignore-caseপরিচালনা করার প্রায় কয়েকটি " " বিরতি ছিল এবং পুনরায় নামকরণের সাথে টাই-ব্রেকিং ছিল যা ঠিক করা হয়েছে।

7c5045f প্রতিশ্রুতিবদ্ধ দেখুন , জেফ কিং ( ) এর দ্বারা প্রতিশ্রুতিবদ্ধ 76f9e56 (03 মে 2020 )(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 6de1630 , 08 মে 2020)peff
gitster

ref-filter: সমস্ত ব্যবহারকারীর বাছাইয়ের পরেই ফ্যালব্যাক পুনঃনামকরণ সাজান প্রয়োগ করুন

সাইন-অফ-বাই: জেফ কিং

কমিট 9e468334b4 ( " ref-filter: বর্ণানুক্রমিক তুলনা উপর ফলব্যাক", 2015-10-30, গীত v2.7.0-rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 10 ) শেখানো সুত্র-Filter এর সাজানোর তুলনা refnames ফলব্যাক করতে।
তবে এটি ভুল স্তরে এটি করেছে, --sortসমস্ত ধরণের চাবি শেষ হয়ে যাওয়ার পরিবর্তে ব্যবহারকারীর থেকে একক চাবি তুলনার ফলাফলকে " " ওভাররাইড করে ।

এটি একক --sortবিকল্পের জন্য সঠিকভাবে কাজ করেছে , তবে একাধিকটির জন্য নয়।
আমরা পুনর্নামকরণের সাথে প্রথম কীটিতে কোনও সম্পর্ক ভাঙবো এবং দ্বিতীয় কীটি কখনই মূল্যায়ন করব না।

বিষয়গুলি আরও আকর্ষণীয় করে তুলতে, আমরা কখনও কখনও কেবল এই ফ্যালব্যাকটি প্রয়োগ করি!
" taggeremail" জাতীয় ক্ষেত্রের জন্য যার জন্য স্ট্রিং তুলনা প্রয়োজন, আমরা সত্যিকার অর্থে strcmp()এটি 0 ছিলাম তবে তার ফলাফলটি ফিরিয়ে আনতাম
But তবে " value" জাতীয় সংখ্যার ক্ষেত্রগুলির জন্য taggerdate, আমরা ফলব্যাক প্রয়োগ করেছি। এবং এজন্যই আমাদের একাধিক বাছাই পরীক্ষা এটি মিস করেছে: এটি taggeremailমূল তুলনা হিসাবে ব্যবহার করে।

সুতরাং আরও অনেক কঠোর পরীক্ষা যোগ করে শুরু করা যাক। আমাদের কাছে দুটি ট্যাগ ইমেইল, তারিখ এবং পুনর্নবীকরণের প্রতিটি সংমিশ্রণ প্রকাশ করে কমিটের একটি সেট থাকবে। তারপরে আমরা নিশ্চিত করতে পারি যে আমাদের সাজানটি সঠিক অগ্রগতির সাথে প্রয়োগ করা হয়েছে এবং আমরা স্ট্রিং এবং মান উভয়কেই তুলছি।

এটি ত্রুটিটি দেখায় এবং ফিক্সটি সহজ: compare_refs()সমস্ত ref_sortingকীগুলি শেষ হয়ে যাওয়ার পরে, ফলব্যাকটি বাইরের ফাংশনে নিয়ে যায় ।

নোট করুন যে বাইরের ফাংশনে আমাদের একটি "ignore_case"পতাকা নেই, কারণ এটি প্রতিটি পৃথক ref_sortingউপাদানের অংশ । আমরা যেমন ব্যবহারকারীর কীগুলি মেলানোর জন্য ব্যবহার করি নি সেহেতু এই জাতীয় ফলব্যাকটি কী করা উচিত তা বিতর্কযোগ্য।
তবে এখন অবধি আমরা এই পতাকাটিকে সম্মান করার চেষ্টা করে যাচ্ছি, তাই সর্বনিম্ন আক্রমণাত্মক জিনিসটি এটি চালিয়ে যাওয়ার চেষ্টা করা উচিত।
যেহেতু বর্তমান কোডের সমস্ত কলার হয় হয় সমস্ত কী বা কোনওটির জন্য পতাকা সেট করে, তাই আমরা প্রথম কী থেকে পতাকাটি টানতে পারি। একটি অনুমানের জগতে যেখানে ব্যবহারকারী সত্যিই কীগুলির কেস-সংবেদনশীলতা আলাদাভাবে ফ্লিপ করতে পারে, আমরা সেই ক্ষেত্রে একটি কম্বল থেকে পৃথক করার জন্য কোডটি প্রসারিত করতে চাই " --ignore-case"।


এই বিকল্পটির সাথে রিমোটগুলি তালিকাবদ্ধ করতে, যোগ করুন-r
ট্রয় ড্যানিয়েলস

@ ট্রয়ডানিয়েলস সম্মত হয়েছে আপনি উত্তর সম্পাদনা করতে পারেন। আমি আপনার সম্পাদনা পর্যালোচনা করব।
ভোনসি

19

আমি একটি আপেক্ষিক তারিখ ব্যবহার এবং শাখার নামটি এইভাবে ছোট করতে চাই:

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

আপডেট: আপনি রঙিন করতে চাইলে এটি করুন:

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"

এটি আমাকে দেয়fatal: unknown field name: '-authordate:iso8601'
ফ্যাক্টর মিস্টিক

1
অভিনব রঙিন আউটপুট অভিনব, তবে এটি সহজ এবং ঠিক আমি যা খুঁজছিলাম। প্রতিস্থাপন refs/headsসঙ্গে refs/remotesদূরবর্তী শাখা কটাক্ষপাত আছে।
ল্যামবার্ট

কমান্ডটি নিজেই সুদৃ is়, তবে উপনামটি একটি ত্রুটি ছুড়ে expansion of alias 'branches' failed; 'echo' is not a git command
ফিলিপ কাহন

আমার জন্য কাজ কর. আপনি কেবল টার্মিনালে এটি পেস্ট করে কপি করলে কী হয়? (echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
n8tr

17

গিট 2.19 হিসাবে আপনি কেবল:

git branch --sort=-committerdate

আপনি এটিও করতে পারেন:

git config branch.sort -committerdate

সুতরাং আপনি যখনই বর্তমান সংগ্রহশালায় শাখা তালিকাভুক্ত করবেন, তখন এটি প্রতিশ্রুতিবদ্ধ অনুসারে বাছাই করা তালিকাভুক্ত হবে।

আপনি যখনই শাখাগুলি তালিকাবদ্ধ করেন, আপনি কমেন্টেরেটে বাছাই করতে চান:

git config --global branch.sort -committerdate

দাবি অস্বীকার: আমি গিতের এই বৈশিষ্ট্যের লেখক এবং যখন আমি এই প্রশ্নটি দেখেছি তখন এটি প্রয়োগ করেছি।


2
বেশিরভাগ আপ টু ডেট উত্তর, জটিল স্ক্রিপ্ট বা উপকরণ ব্যবহারের চেয়ে অনেক সহজ
👌

সতর্কতার সাথে ব্যবহার করুন! সবাইকে সাবধান করুন, শাখাগুলি তালিকাভুক্ত করার জন্য এটি কোনও আদেশ নয়। এটি গিটের কনফিগারেশন পরিবর্তন করার একটি আদেশ এবং এতে স্থায়ী বৈশ্বিক প্রতিক্রিয়া থাকবে।
জাজিমভ

1
@ জাজিমভ আপনি ঠিক বলেছেন, আমি উত্তরটি সম্পাদনা করেছি যাতে এটি আরও পরিষ্কার হয়
ব্যবহারকারী 801247

11

কিছু রঙ যুক্ত করে (যেহেতু pretty-formatউপলভ্য নয়)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

আমারও একই সমস্যা ছিল, তাই আমি টুইবি নামে একটি রুবি রত্ন লিখেছিলাম । এটি কালানুক্রমিক ক্রমে শাখাগুলি তালিকাবদ্ধ করে (সর্বপ্রথম নতুন) এবং আপনাকে সর্বোচ্চ বয়স নির্ধারণ করতে দেয় যাতে আপনি সমস্ত শাখা তালিকাভুক্ত না করেন (যদি আপনার অনেকগুলি থাকে)। উদাহরণ স্বরূপ:

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

এটি আপনাকে প্রতিটি শাখার জন্য কাস্টম বৈশিষ্ট্যগুলি সংরক্ষণ করতে দেয়, যেমন, টিকিট আইডি, স্থিতি, টোডস এবং এই বৈশিষ্ট্য অনুসারে শাখাগুলির তালিকা ফিল্টার করে। আরও তথ্য: http://rondevera.github.io/twig/


5
এই নামটি হয়ত সাহায্য করবে না কারণ আমি নিশ্চিত যে একই নামের সাথে কয়েকটি সফ্টওয়্যার রয়েছে।
thoroc

8

আমি নিম্নলিখিত কমান্ডটি নিয়ে এসেছি (গিট 2.13 এবং তারপরের জন্য):

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

আপনার যদি না থাকে তবে columnআপনি শেষ লাইনটি প্রতিস্থাপন করতে পারেন

    | sed -e "s/;/\t/g"

আউটপুট মত দেখাচ্ছে

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

বিভিন্ন টুকরা কীভাবে কাজ করে সে সম্পর্কে আমি একটি ব্লগ পোস্ট লিখেছিলাম ।


খুশী হলাম। +1 টি। এটি স্ট্যাকওভারফ্লো . com/a/33163401/6309 এgit branch --sort উল্লিখিত আমি ব্যবহার করে does
ভোনসি

@ ড্যানিসিসনবাউম নিশ্চিত করুন যে আপনি গিট 2.13 (মে 2017 এ প্রকাশিত) বা তার পরে ব্যবহার করছেন।
বিডেশম

7

এফওয়াইআই, আপনি যদি সম্প্রতি চেক করা শাখাগুলির একটি তালিকা পেতে চান (সম্প্রতি প্রতিশ্রুতিবদ্ধ হওয়ার বিপরীতে) আপনি গিটের রিফলগ ব্যবহার করতে পারেন:

$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything

আরও দেখুন: আমি যে গিট শাখাগুলি সম্প্রতি পরীক্ষা করে দেখেছি তার একটি তালিকা আমি কীভাবে পেতে পারি?


5

সাম্প্রতিক শাখাগুলির মধ্যে স্যুইচ করতে আমি এখানে একটি ছোট স্ক্রিপ্ট ব্যবহার করেছি:

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

এই দুটি উপকরণ ব্যবহার:

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

কেবল এটিকে একটি গিট সংগ্রহস্থলে কল করুন এবং এটি আপনাকে সর্বশেষ এন শাখা (ডিফল্টরূপে 10) এবং প্রতিটি সংখ্যার পাশে রেখে দেবে। শাখার নম্বর ইনপুট করুন এবং এটি পরীক্ষা করে দেখুন:

এখানে চিত্র বিবরণ লিখুন


4

সাধারণত আমরা সম্প্রতি প্রত্যন্ত শাখাগুলি বিবেচনা করি। সুতরাং এটি চেষ্টা করুন

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

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

এর অবদান হ'ল এটি আপনার গিট কনফিগারেশন থেকে কিছু রঙ টানছে (বা ডিফল্ট ব্যবহার করে)।

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}

3

এটি সাeedদগ্নুর সংস্করণে ভিত্তি করে তৈরি হয়েছে , তবে বর্তমান শাখার সাথে একটি তারা এবং রঙের সাথে প্রদর্শিত হয়েছে এবং কেবল এমন কিছু দেখাচ্ছে যা "মাস" বা "বছর" আগে বর্ণিত নয়:

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done

2

স্ক্রিপ্ট হিসাবে আমার সেরা ফলাফল:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done

1
কি ধরনের স্ক্রিপ্ট? ব্যাশ?
পিটার মর্টেনসেন 21

2

git branch --sort=-committerdate | head -5

প্রতিশ্রুতিবদ্ধতার তারিখের উপর ভিত্তি করে সর্বাধিক 5 টি শাখার নাম বাছাই করতে আগ্রহী যে কারও জন্য।


2

গৃহীত কমান্ড-লাইনের উত্তর শক দেয় তবে আপনি যদি জিইআইআই এর মতো সুন্দর কিছু চান এবং আপনার উত্স === "গিথুব"।

আপনি সংগ্রহস্থলের "শাখা" ক্লিক করতে পারেন। অথবা সরাসরি ইউআরএল হিট করুন: https://github.com/ORGANIZATION_NAME/REPO_NAME/bank


1

আমি যে বৈচিত্রটি সন্ধান করছিলাম তা এখানে:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

যে tail -rতালিকা reverses তাই সর্বাধিক সাম্প্রতিক commiterdateশেষবার।


3
এটি সম্পাদন করতে আপনি --sort =-কমিটরডেট - --ort = কমিটরডেটেও পরিবর্তন করতে পারেন।
13:51


1

dialogআমাকে একটি ইন্টারেক্টিভ তালিকা দেওয়ার জন্য আমি গৃহীত উত্তর থেকে আউটপুটটি পাইপ করি :

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

(যেমন) ~/bin/git_recent_branches.shএবং chmod +xএটি হিসাবে সংরক্ষণ করুন তারপরে git config --global alias.rb '!git_recent_branches.sh'আমাকে নতুন git rbকমান্ড দেওয়ার জন্য।


1

আমি জানি যে ইতিমধ্যে প্রচুর উত্তর রয়েছে, তবে এখানে একটি সাধারণ ওরফে জন্য আমার দুটি সেন্ট রয়েছে (আমি আমার সাম্প্রতিক শাখাটি নীচে রাখতে চাই):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

এটি আপনার বর্তমান শাখাটি হাইলাইট করা (এবং এটির একটি নক্ষত্র রয়েছে) রঙের সাথে আপনার সর্বশেষ 15 শাখাগুলির একটি সুন্দর ওভারভিউ দেবে।


1

কোনও উলেস সেট করার চেষ্টা করার সময় bash_ প্রোফাইলে ম্যাকের একক উক্তিগুলি পরিচালনা করতে কিছু সমস্যা হয়েছিল। এই উত্তরটি সমাধান করতে সহায়তা করেছে " একক উদ্ধৃতিযুক্ত স্ট্রিংয়ের মধ্যে কীভাবে একক উদ্ধৃতিগুলি রক্ষা পাওয়া যায়

কাজের সমাধান:

alias gb='git for-each-ref --sort=committerdate refs/heads/ --format='"'"'%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'"'"''

আমার খ্যাতির কারণে পিএস মন্তব্য করতে পারেনি


0

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' এটি আপনার প্রয়োজন


0

গিট ভি ২.১৯branch.sort কনফিগার বিকল্পটি উপস্থাপন করে ( শাখা.সোর্ট দেখুন ) )।

সুতরাং git branchকমিটরের তারিখ অনুসারে বাছাই করা হবে (desc) সাথে ডিফল্ট

# gitconfig
[branch]
    sort = -committerdate     # desc

লিপি:

$ git config --global branch.sort -committerdate

হালনাগাদ:

সুতরাং,

$ git branch
* dev
  master
  _

এবং

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.