আমি কেবল আরেকটি সম্ভাব্য পদ্ধতির নোট করতে চাই - এবং তা হ'ল git
গিট-নোট (1) ব্যবহার করে , যা ভি ১.6..6 ( স্বরে টোটাল - গিট ) (আমি git
সংস্করণটি 1.7.9.5 ব্যবহার করছি )।
মূলত, আমি git svn
লিনিয়ার ইতিহাস (কোনও স্ট্যান্ডার্ড বিন্যাস, কোনও শাখা, কোনও ট্যাগ নেই) সহ একটি এসভিএন সংগ্রহস্থল ক্লোন করতাম এবং আমি ক্লোন করা git
সংগ্রহস্থলে পুনর্বিবেচনার সংখ্যার তুলনা করতে চেয়েছিলাম । এই গিট ক্লোনটিতে ডিফল্টরূপে ট্যাগ নেই, তাই আমি ব্যবহার করতে পারি না git describe
। এখানে কৌশলটি সম্ভবত কেবল রৈখিক ইতিহাসের জন্য কাজ করবে - নিশ্চিত নয় যে এটি মার্জ ইত্যাদির সাথে কীভাবে চালু হবে; তবে এখানে মূল কৌশলটি:
git rev-list
সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাসের তালিকা
জিজ্ঞাসা করুন
- যেহেতু
rev-list
"বিপরীত কালানুক্রমিক ক্রমে" ডিফল্টরূপে হয় তাই আমরা --reverse
প্রাচীনতম অনুসারে বাছাই করা কমিটের তালিকা পেতে তার স্যুইচটি ব্যবহার করব
bash
শেল থেকে
ব্যবহার করুন
- রিভিশন কাউন্টার হিসাবে প্রতিটি প্রতিশ্রুতিতে একটি কাউন্টার ভেরিয়েবল বাড়ান,
- প্রতিটি কমিটের জন্য একটি "অস্থায়ী" গিট নোট তৈরি করুন এবং যুক্ত করুন
- তারপর, ব্যবহার করে লগ ব্রাউজ
git log
সঙ্গে --notes
, যা একটি কমিট এর নোট, যা এই ক্ষেত্রে "সংস্করণ সংখ্যা" হবে ডাম্প হবে
- হয়ে গেলে অস্থায়ী নোটগুলি মুছুন
git status
( এনবি: এই নোটগুলি প্রতিশ্রুতিবদ্ধ কিনা তা আমি নিশ্চিত নই; সেগুলি সত্যই প্রদর্শিত হয় না )
প্রথমে নোটের git
ডিফল্ট অবস্থান রয়েছে তা নোট করুন - তবে আপনি নোটগুলির জন্য একটি ref
(উত্সাহ) নির্দিষ্ট করতে পারেন - যা সেগুলি নীচে একটি পৃথক ডিরেক্টরিতে সঞ্চয় করবে .git
; উদাহরণস্বরূপ, একটি git
রেপো ফোল্ডারে থাকাকালীন , আপনি git notes get-ref
যে ডিরেক্টরিটি হবে তা দেখতে কল করতে পারেন:
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
লক্ষণীয় বিষয়টি হ'ল আপনি যদি notes add
একটি দিয়ে থাকেন তবে আপনাকে --ref
অবশ্যই পরে সেই রেফারেন্সটি ব্যবহার করতে হবে - অন্যথায় আপনি " অবজেক্ট XXX এর জন্য কোনও নোট পাওয়া যায়নি ... " এর মতো ত্রুটি পেতে পারেন ।
এই উদাহরণস্বরূপ, আমি ref
নোটগুলিকে "লিনেরিভ" (লিনিয়ার রিভিশনের জন্য) কল করতে বেছে নিয়েছি - এর অর্থ এটিও নয় যে পদ্ধতিটি ইতিমধ্যে বিদ্যমান নোটগুলির সাথে হস্তক্ষেপ করবে। আমি --git-dir
স্যুইচটিও ব্যবহার করছি , git
নবাগত হওয়ার কারণে , এটি বুঝতে আমার কিছুটা সমস্যা হয়েছিল - তাই আমি "পরে মনে রাখব" চাই :)
; এবং আমি ব্যবহার --no-pager
করার less
সময় স্প্যানিং দমন করতেও ব্যবহার করি git log
।
সুতরাং, ধরে নিই যে আপনি একটি ডিরেক্টরিতে myrepo_git
রয়েছেন , এমন একটি সাব-ফোল্ডার যা একটি git
সংগ্রহস্থল; এক করতে পারে:
### check for already existing notes:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
### iterate through rev-list three, oldest first,
### create a cmdline adding a revision count as note to each revision
$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
TCMD="$TCMD add $ih -m \"(r$((++ix)))\""; \
echo "$TCMD"; \
eval "$TCMD"; \
done
# git --git-dir=./myrepo_git/.git notes --ref linrev add 6886bbb7be18e63fc4be68ba41917b48f02e09d7 -m "(r1)"
# git --git-dir=./myrepo_git/.git notes --ref linrev add f34910dbeeee33a40806d29dd956062d6ab3ad97 -m "(r2)"
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev add 04051f98ece25cff67e62d13c548dacbee6c1e33 -m "(r15)"
### check status - adding notes seem to not affect it:
$ cd myrepo_git/
$ git status
# # On branch master
# nothing to commit (working directory clean)
$ cd ../
### check notes again:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# (r15)
### note is saved - now let's issue a `git log` command, using a format string and notes:
$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
# 77f3902: _user_: Sun Apr 21 18:29:00 2013 +0000: >>test message 14<< (r14)
# ...
# 6886bbb: _user_: Sun Apr 21 17:11:52 2013 +0000: >>initial test message 1<< (r1)
### test git log with range:
$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
### erase notes - again must iterate through rev-list
$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
TCMD="$TCMD remove $ih"; \
echo "$TCMD"; \
eval "$TCMD"; \
done
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# Removing note for object 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# git --git-dir=./myrepo_git/.git notes --ref linrev remove f34910dbeeee33a40806d29dd956062d6ab3ad97
# Removing note for object f34910dbeeee33a40806d29dd956062d6ab3ad97
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 04051f98ece25cff67e62d13c548dacbee6c1e33
# Removing note for object 04051f98ece25cff67e62d13c548dacbee6c1e33
### check notes again:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
সুতরাং, কমপক্ষে কোনও শাখাবিহীন সম্পূর্ণ রৈখিক ইতিহাসের আমার নির্দিষ্ট ক্ষেত্রে, সংশোধন সংখ্যাগুলি এই পদ্ধতির সাথে মেলে বলে মনে হচ্ছে - এবং অতিরিক্ত হিসাবে, মনে হয় যে এই পদ্ধতির git log
পুনর্বিবেচনা রেঞ্জগুলির সাথে ব্যবহার করার অনুমতি দেবে , যখন এখনও সঠিক সংশোধন সংখ্যাগুলি পাবে - ওয়াইএমএমভি ভিন্ন প্রসঙ্গে, যদিও ...
আশা করি এটি কাউকে সাহায্য করবে,
চিয়ার্স!
সম্পাদনা: ঠিক আছে, git
উপরের লুপগুলির জন্য এলিয়াস সহ , এটি বলা যায় setlinrev
এবং এখানে কিছুটা সহজ unsetlinrev
; আপনার গিট রিপোজিটরি ফোল্ডারে থাকাকালীন করুন ( দুষ্টু পালানোর বিষয়টি নোট করুন bash
, # 16136745 দেখুন - একটি সেমিকেলনযুক্ত একটি গিট ওরফে যুক্ত করুন ):
cat >> .git/config <<"EOF"
[alias]
setlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
TCMD=\"git notes --ref linrev\"; \n\
TCMD=\"$TCMD add $ih -m \\\"(r\\$((++ix)))\\\"\"; \n\
#echo \"$TCMD\"; \n\
eval \"$TCMD\"; \n\
done; \n\
echo \"Linear revision notes are set.\" '"
unsetlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
TCMD=\"git notes --ref linrev\"; \n\
TCMD=\"$TCMD remove $ih\"; \n\
#echo \"$TCMD\"; \n\
eval \"$TCMD 2>/dev/null\"; \n\
done; \n\
echo \"Linear revision notes are unset.\" '"
EOF
... যাতে git setlinrev
লিনিয়ার রিভিশন নোট জড়িত লগ করার চেষ্টা করার আগে আপনি কেবল অনুরোধ করতে পারেন ; এবং git unsetlinrev
আপনার কাজ শেষ হয়ে গেলে সেই নোটগুলি মুছতে; গিট রেপো ডিরেক্টরি থেকে একটি উদাহরণ:
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 <<
$ git setlinrev
Linear revision notes are set.
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
$ git unsetlinrev
Linear revision notes are unset.
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 <<
এই গোপনীয়তাটি সম্পূর্ণ করতে শেলটি যে সময় নেবে তা নির্ভর করে সংগ্রহস্থলের ইতিহাসের আকারের উপর।