কমিট বার্তায় গিটের শাখার নাম কীভাবে যুক্ত করবেন?


102

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


3
যে কেউ এখানে আসছেন তাদের পক্ষে মনে হয় সেরা উত্তরটি পৃষ্ঠার নীচে রয়েছে
বেন টালিডিয়োরোস

পার্শ্ব নোট: git branch | grep ...বর্তমান শাখা পাওয়ার জন্য সমস্তই এটি করার ভুল উপায়। হয় বিবেচনা করুন git symbolic-ref -q HEAD( এই উত্তরে প্রদর্শিত হিসাবে ) বা git rev-parse --abbrev-ref HEAD। প্রতীকী-রেফ কমান্ডটি ব্যর্থ হবে যদি আপনি কোনও বিচ্ছিন্ন হেড হন, সুতরাং আপনি যদি এই কেসটি সনাক্ত করতে চান তবে এটি ব্যবহার করুন। অন্যথায় রেভ-পার্স --abbrev-ref পদ্ধতি সম্ভবত সেরা।
torek

উত্তর:


53

prepare-commit-msgবা commit-msg গিথুক ব্যবহার করুন ।

ইতিমধ্যে আপনার PROJECT/.git/hooks/ডিরেক্টরিতে উদাহরণ রয়েছে ।

সুরক্ষা ব্যবস্থা হিসাবে, আপনি ব্যবহার করতে চান এমন প্রতিটি ভান্ডারটিতে আপনাকে ম্যানুয়ালি এমন হুক সক্ষম করতে হবে। যদিও, আপনি স্ক্রিপ্টটি প্রতিশ্রুতিবদ্ধ করতে পারেন এবং এটি সমস্ত ক্লোনে .git/hooks/ডিরেক্টরিতে অনুলিপি করতে পারেন ।


ধন্যবাদ একটি দুর্দান্ত সীসা; ধন্যবাদ. আপনি যদি আমাকে আরও স্ক্রিপ্ট দিয়ে সাহায্য করতে পারেন তবে আমি কৃতজ্ঞ হব :)
টোমর লিচতাশ

5
আমার দরকার নেই, আপনার ইতিমধ্যে একটি উদাহরণ রয়েছে যা আপনি যা চান ঠিক তেমন করে যা আমি ইতিমধ্যে বলেছি .git/hooks/prepare-commit-msg.sample। =) সমস্ত (মন্তব্য দিকনির্দেশ নিম্নলিখিত পর পরিবর্তন করতে) প্রয়োজন কপি-পেস্ট থেকে যাই হোক না কেন সমাধান stackoverflow.com/questions/1593051/... আপনি চান
ninjagecko

4
@ নিনজাগেকো, আমার জন্য .git/hooks/prepare-commit-msg.sampleতিনটি উদাহরণ রয়েছে। বিবাদ বিভাগে মন্তব্য করার জন্য, এতে git diff --name-status -rআউটপুট যুক্ত করার জন্য এবং সাইন-অফ-বাই লাইন যুক্ত করার জন্য ... প্রতিশ্রুতি বার্তায় কোনও শাখার নাম যুক্ত করা হচ্ছে না। সুতরাং আমি নিজের হুক লিখতে বাধ্য হয়েছিলাম।
shytikov

1
এর you will have to manually enable such a hook on each repository you wish to use itঅর্থ কি এই যে আপনি ফাইলটিকে কার্যকর করার অনুমতি দিতে হবে? যদি তা হয় তবে আমি কী (বা আপনি, দয়া করে) অন্তর্ভুক্ত করার জন্য উত্তরটি সম্পাদনা করতে পারি?
ড্যান রোজনস্টার্ক

1
কেন এই উত্তর? এটি আপনার মতো আমাকে গুগল করার মতো like @ শিতিকভের উত্তর নির্বাচন করা উচিত
TheRealFakeNews

177

commit-msgউদাহরণ হিসাবে আমার স্ক্রিপ্ট এখানে :

#!/bin/sh
#
# Automatically adds branch name and branch description to every commit message.
#
NAME=$(git branch | grep '*' | sed 's/* //') 
DESCRIPTION=$(git config branch."$NAME".description)

echo "$NAME"': '$(cat "$1") > "$1"
if [ -n "$DESCRIPTION" ] 
then
   echo "" >> "$1"
   echo $DESCRIPTION >> "$1"
fi 

নিম্নলিখিত প্রতিশ্রুতি বার্তা তৈরি করে:

[branch_name]: [original_message]

[branch_description]

আমি ইস্যু নম্বরটি ব্যবহার করছি branch_name, ইস্যু বিবরণটি branch_descriptionইউজ git branch --edit-description [branch_name]কমান্ডে স্থাপন করা হয়েছে ।

শাখার বিবরণ সম্পর্কে আরও আপনি এই প্রশ্নোত্তরটিতে খুঁজে পেতে পারেন ।

কোড উদাহরণটি নিম্নলিখিত গিস্টে সঞ্চিত আছে ।


8
এই স্ক্রিপ্টটি একক লাইনে বহু লাইন প্রতিশ্রুতি বার্তা স্কোয়াশ করে। আমি আপনার প্রতিধ্বনি বিবৃতিটি প্রতিস্থাপন করেছি: প্রতিধ্বনি -n "$ NAME" ':' | বিড়াল - "$ 1"> / tmp / আউট এবং&vv / tmp / আউট "$ 1"
অ্যালেক্স স্পেন্স

4
এই ফাইলটি ফোল্ডারে PROJECT / .git / hooks /
ক্যাটানোরে

2
এটা ভাল কাজ করে. তবে ম্যাকের জন্য, এটির কাজ করার জন্য আমাকেও অনুমতি নির্ধারণ করতে হয়েছিল: >>> sudo chmod 755 .git / hooks / কমিট - চিত্র
মনোজ শ্রেষ্ঠ

1
@ মনোজশ্রেষ্ঠা হ্যাঁ এটি কার্যকর করতে হবে
ডেভিড মান

2
অ্যালেক্সস্পেন্সটি আরও সহজেই আপনি ব্যবহার করতে পারেন echo $NAME: "$(cat $1)" > $1। এটি কাজ করে কারণ নিউলাইনগুলি হারিয়ে যাওয়ার কারণটি হ'ল প্রতিধ্বনিকে প্রতিটি লাইনটিকে $(cat "$1")একটি নতুন যুক্তি হিসাবে বিবেচনা করা হয়েছিল এবং প্রতিটিটির মাঝে একটি ফাঁক দিয়ে প্রতিধ্বনি করা হচ্ছে। $(cat "$1")ডাবল উদ্ধৃতি দিয়ে চারপাশে , প্রতিধ্বনি বিড়াল আউটপুটকে একক যুক্তি হিসাবে বিবেচনা করে। এছাড়াও আমি মনে করি না $1যেহেতু এর মূল্য .git/COMMIT_EDITMSG
হওয়ায়

30

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

এই ফাইলটি তৈরি করুন .git / আঙ্গুলসমূহ / প্রস্তুত কমিট-বার্তা :

#!/bin/bash

branchPath=$(git symbolic-ref -q HEAD) #Somthing like refs/heads/myBranchName
branchName=${branchPath##*/}      #Get text behind the last / of the branch path

firstLine=$(head -n1 $1)

if [ -z "$firstLine"  ] ;then #Check that this is not an amend by checking that the first line is empty
    sed -i "1s/^/$branchName: \n/" $1 #Insert branch name at the start of the commit message file
fi

4
আমি পেতে: এটি sed: 1: ".git/COMMIT_EDITMSG": invalid command code .ব্যবহার করার সময়।
আদম পার্কিন

1
আহা, ম্যাক ওএসএক্স পার্থক্য, দেখুন: ফিক্সের জন্য hintsforums.macworld.com/showpost.php?p=393450&postcount=11
অ্যাডাম পার্কিন

2
সংশোধন এবং
ফিক্সআপ

3
ওএসএক্স: আপনি যদি উপরের ত্রুটি বার্তাটি পেয়ে থাকেন তবে কাজ করতে ফাইল এক্সটেনশনের প্রয়োজন। sed -i '.bak' "1s/^/$branchName : \n/" $1
ক্যানিনটেক্স

আপনি পরিবর্তে বিভাজক @হিসাবে ব্যবহার করতে পারেন যেহেতু ফরোয়ার্ড স্ল্যাশগুলি শাখার নামটিতে প্রদর্শিত বা বার্তা দেওয়ার, স্ক্রু আপ করার সম্ভাবনা বেশি । sed/sed
অরি ব্যান্ড

28

আপনি এটি প্রস্তুত-প্রতিশ্রুতি-চিত্র এবং প্রাক কমিট হুকের সংমিশ্রণে করতে পারেন do

.git / আঙ্গুলসমূহ / প্রস্তুত কমিট-বার্তা

#!/bin/sh

BRANCH=`git branch | grep '^\*' | cut -b3-`
FILE=`cat "$1"`
echo "$BRANCH $FILE" > "$1"

.git / আঙ্গুলসমূহ / পূর্ব-কমিট

#!/bin/bash

find vendor -name ".git*" -type d | while read i
do
        if [ -d "$i" ]; then
                DIR=`dirname $i`
                rm -fR $i
                git rm -r --cached $DIR > /dev/null 2>&1
                git add $DIR > /dev/null 2>&1
        fi
done

অনুমতি সেট করুন

sudo chmod 755 .git/hooks/prepare-commit-msg
sudo chmod 755 .git/hooks/pre-commit

মনে রাখবেন যে আপনি --amendউদাহরণস্বরূপ ব্যবহার করা হলে এটি মূল প্রতিশ্রুতি বার্তাটি সরিয়ে ফেলতে পারে । পরিবর্তে echoব্যবহারের sedপরিবর্তে আপনার ব্যবহার করা উচিত । এখানে এটি একটি sed -i "1s@^@$(git branch | grep '^\*' | cut -b3-) @" $1
ওলাইনারে রয়েছে

10

রেডি-কমিট-ফাইল ফাইলটিতে নীচের কোডটি যুক্ত করুন।

#!/bin/sh
#
# Automatically add branch name and branch description to every commit message except merge commit.
#

COMMIT_EDITMSG=$1

addBranchName() {
  NAME=$(git branch | grep '*' | sed 's/* //') 
  DESCRIPTION=$(git config branch."$NAME".description)
  echo "[$NAME]: $(cat $COMMIT_EDITMSG)" > $COMMIT_EDITMSG
  if [ -n "$DESCRIPTION" ] 
  then
     echo "" >> $COMMIT_EDITMSG
     echo $DESCRIPTION >> $COMMIT_EDITMSG
  fi 
}

MERGE=$(cat $COMMIT_EDITMSG|grep -i 'merge'|wc -l)

if [ $MERGE -eq 0 ] ; then
  addBranchName
fi

এটি মার্জ-কমিট বাদে বার্তা দেওয়ার জন্য শাখার নাম যুক্ত করবে। মার্জ-কমিটের ডিফল্টরূপে শাখার তথ্য রয়েছে তাই অতিরিক্ত শাখার নাম অপ্রয়োজনীয় এবং বার্তাটিকে কুশ্রী করে তোলে।


1
সুতরাং এই প্রতিশ্রুতি বার্তা সংশোধন করবে না যখন এটি বার্তাটিতে মার্জ শব্দটি খুঁজে পাবে?
thoroc

1
@ থারোক যা প্রযুক্তিগতভাবে সঠিক; তবে সাধারণ ব্যবহারে এটি বড় কথা নয় isn't প্রতিশ্রুতিবদ্ধ বার্তাটি পার্স করা হচ্ছে সেগুলি সম্পাদনার আগে আপনি "ডিফল্ট" ones সুতরাং যতক্ষণ না আপনার প্রতিশ্রুতিবদ্ধ টেমপ্লেটটিতে "মার্জ" শব্দটি থাকে না ততক্ষণ আমি বিশ্বাস করি আপনার ঠিক হওয়া উচিত (যতক্ষণ না অন্য "ডিফল্ট" বার্তাগুলি কোনও ডিফল্ট মার্জ কমিট বার্তা বাদ দেয় না)। আমি এটিকে মূলত ভুল বুঝেছি, এবং বিশ্বাস করি এখনই এটি ঠিক আছে।
নভিসি সি

5

টিমের উত্তর দ্বারা অনুপ্রাণিত যা শীর্ষের উত্তরের উপর ভিত্তি করে তৈরি হয়, এটি প্রস্তুত-কমিট-জিপি হুক আর্গুমেন্ট হিসাবে প্রমাণিত করে যে কী ধরনের প্রতিশ্রুতি ঘটছে তা গ্রহণ করে । ডিফল্ট প্রস্তুতি-প্রতিশ্রুতি হিসাবে দেখা যায় - যদি $ 2 'মার্জ' হয় তবে এটি একটি মার্জ কমিট। এইভাবে টিমের অ্যাডব্র্যাঙ্কনাম () ফাংশন অন্তর্ভুক্ত করতে কেস স্যুইচ পরিবর্তন করা যেতে পারে।

আমি কীভাবে শাখার নাম যুক্ত করতে পারি এবং ডিফল্ট prepare-commit-msg.sampleহুকের সমস্ত অবিচ্ছিন্ন অংশ কীভাবে যুক্ত করতে হয় তার জন্য আমি আমার নিজের পছন্দকে অন্তর্ভুক্ত করেছি ।

প্রস্তুত কমিট-বার্তা

#!/bin/sh

addMyBranchName() {
  # Get name of current branch
  NAME=$(git branch | grep '*' | sed 's/* //')

  # First blank line is title, second is break for body, third is start of body
  BODY=`cut -d \| -f 6 $1 | grep -v -E .\+ -n | cut -d ':' -f1 | sed '3q;d'`

  # Put in string "(branch_name/): " at start of commit message body.
  # For templates with commit bodies
  if test ! -z $BODY; then
    awk 'NR=='$BODY'{$0="\('$NAME'/\): "}1;' $1 > tmp_msg && mv tmp_msg "$1"
  else
    echo "title\n\n($NAME/):\n`cat $1`\n" > "$1"
  fi
}

# You might need to consider squashes
case "$2,$3" in
  # Commits that already have a message
  commit,?*)
  ;;

  # Messages are one line messages you decide how to handle
  message,)
  ;;

  # Merge commits
  merge,)
    # Comments out the "Conflicts:" part of a merge commit.
    perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1"
  ;;

  # Non-merges with no prior messages
  *)
    addMyBranchName $1
  ;;
esac

4

আপনি যদি এটি বিশ্বব্যাপী করতে চান (সমস্ত প্রকল্পের জন্য):

শাইতিকভের উত্তরেরgit-msg বিষয়বস্তু দিয়ে ফাইল তৈরি করুন এবং এটি কোনও ফোল্ডারে রেখে দিন:

mkdir -p ~/.git_hooks
# make it executable
chmod a+x ~/.git_hooks/commit-msg

এখন হুক সক্ষম করুন:

git config --global init.templatedir '~/.git_hooks'

এবং git initপ্রতিটি প্রকল্পে আবার আপনি এটি ব্যবহার করতে চান।


2
আমি দেখতে পেয়েছি যে এই বৈশিষ্ট্যটি ব্যবহার করতে, আমাকে 'init -templatedir' এর জন্য কনফিগার করা ডিরেক্টরিটির ভিতরে একটি 'হুকস' ডিরেক্টরিতে 'কমিট-চিহ্ন' রাখতে হয়েছিল যাতে পুরো টেম্প্লেটির যখন 'git init' এ অনুলিপি হয়ে যায়, 'কমিট- প্রকল্প 'প্রকল্পের' .git / হুকস 'ডিরেক্টরিতে শেষ হয়।
ড্যান

2

এটি জিএনইউর sedপরিবর্তে বিএসডি ব্যবহার করে বলে ম্যাকওএসে কাজ করার জন্য আমার এই সমাধানগুলি পেতে সমস্যা হচ্ছিল sed। আমি একটি সাধারণ স্ক্রিপ্ট তৈরি করতে সক্ষম হয়েছি যা কাজটি করে। এখনও ব্যবহার করছে .git/hooks/pre-commit:

#!/bin/sh
BRANCH=$(cat .git/HEAD  | cut -d '_' -f2)
if [ ! -z "$BRANCH" ]
then
    echo "$BRANCH" > "/Users/username/.gitmessage" 
else
    echo "[JIRA NUMBER]" > "/Users/username/.gitmessage"
fi 

এটি একটি শাখার নামকরণের মতো মান ধরে functional-desc_JIRA-NUMBER। যদি আপনার শাখার নামটি কেবল আপনার জিরা টিকিট নম্বর হয় তবে আপনি পাইপ থেকে শুরু করে এফ 2 পর্যন্ত সমস্ত কিছু থেকে মুক্তি পেতে পারেন। এটির জন্য .gitmessageআপনার হোম ডিরেক্টরিতে একটি ফাইল থাকা দরকার ।


2

আপনি যদি জিরার টিকিটটি প্রতিশ্রুতি বার্তায় যুক্ত করতে চান তবে স্ক্রিপ্টটি বেলো ব্যবহার করুন।

কিছু বার্তা প্রতিশ্রুতিবদ্ধ PROJECT-2313: Add awesome feature এর জন্য আপনার শাখার নামটি জিরা টিকিট দিয়ে শুরু করা দরকার।

এটি এই সমাধানগুলির সংমিশ্রণ:

এটি ওএস এক্সের সাথে সংশোধিত হয়েছে sed -i '.bak'এবং এটি সোর্স ট্রি থেকেও কাজ করে।

https://gist.github.com/georgescumihai/c368e199a9455807b9fbd66f44160095

#!/bin/sh
#
# A hook script to prepare the commit log message.
# If the branch name it's a jira Ticket.
# It adds the branch name to the commit message, if it is not already part of it.

branchPath=$(git symbolic-ref -q HEAD) #Somthing like refs/heads/myBranchName
branchName=${branchPath##*/}      #Get text behind the last / of the branch path

regex="(PROJECTNAME-[0-9]*)"

if [[ $branchName =~ $regex ]]
then
    # Get the captured portion of the branch name.
    jiraTicketName="${BASH_REMATCH[1]}"

    originalMessage=`cat $1`

    # If the message already begins with PROJECTNAME-#, do not edit the commit message.
    if [[ $originalMessage == $jiraTicketName* ]]
        then
        exit
    fi

    sed -i '.bak' "1s/^/$jiraTicketName: /" $1 #Insert branch name at the start of the commit message file
fi

এটি ক্লায়েন্ট সাইড ফাইলে ভাল কাজ করছে: অটো পপুলেট কমিট উপসর্গের জন্য রেডি-কমিট-জিপি। তবে আমি যদি সার্ভার সাইড হুকের ক্ষেত্রে একই জিনিসটি করতে চাই, যা বিটবাকেট সার্ভার (আমার ক্ষেত্রে) এবং আমি এই যুক্তিটি বিটবকেট সার্ভারের পথে প্রাক-প্রাপ্ত হুকটিতে যুক্ত করার চেষ্টা করছি: BITBUCKET_Home / shared / data / repositories / <repository-id> / hooks / 21_prererereise, এটি "গিট সিম্বলিক-রেফ-কি-হেড" হিসাবে 'মাস্টার' দিচ্ছে না যদিও আমি ক্লায়েন্টের পক্ষ থেকে আমার বৈশিষ্ট্য / এবিসি শাখা থেকে কমিট করছি। এখানে অন্য উপায় আছে?
সনটোশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.