আপনার দেওয়া পরামর্শটি ত্রুটিযুক্ত। নিঃশর্তভাবে GIT_AUTHOR_DATE সেট --env-filter
করতে প্রতিটি প্রতিশ্রুতিবদ্ধতার তারিখটি পুনরায় লিখবে । এছাড়াও, ভিতরে গিট কমিট ব্যবহার করা অস্বাভাবিক হবে --index-filter
।
আপনি এখানে একাধিক, স্বাধীন সমস্যা নিয়ে কাজ করছেন।
"এখন" ছাড়া অন্য তারিখগুলি নির্দিষ্ট করা
প্রতিটি কমিটের দুটি তারিখ থাকে: লেখকের তারিখ এবং প্রতিশ্রুতিবদ্ধতার তারিখ। নতুন প্রতিশ্রুতি লেখার যে কোনও কমান্ডের জন্য আপনি পরিবেশের ভেরিয়েবল GIT_AUTHOR_DATE এবং GIT_COMMITTER_DATE এর মাধ্যমে মান সরবরাহ করে প্রত্যেককে ওভাররাইড করতে পারেন। দেখুন "তারিখ ফর্ম্যাট" এ Git কমিট (1) অথবা নীচের:
Git internal format = <unix timestamp> <time zone offset>, e.g. 1112926393 +0200
RFC 2822 = e.g. Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601 = e.g. 2005-04-07T22:13:13
সাধারণ ব্যবহারের সময় একটি নতুন আদেশ লেখার একমাত্র আদেশ হ'ল গিট কমিট । এটিতে একটি --date
বিকল্প রয়েছে যা আপনাকে সরাসরি লেখকের তারিখ নির্দিষ্ট করতে দেয়। আপনার প্রত্যাশিত ব্যবহারের সাথে git filter-branch --env-filter
উপরে বর্ণিত পরিবেশের ভেরিয়েবলগুলিও অন্তর্ভুক্ত রয়েছে (এগুলি "এনভির অংশ" যার পরে বিকল্পটির নামকরণ করা হয়েছে; গিট-ফিল্টার-শাখায় "বিকল্পগুলি" দেখুন (1) এবং অন্তর্নিহিত "নদীর গভীরতানির্ণয়" কমান্ড গিট-কমিট -tree (1) ।
একটি একক রেফ ইতিহাসে একটি ফাইল In োকানো
যদি আপনার সংগ্রহস্থলটি খুব সহজ হয় (যেমন আপনার কেবলমাত্র একটি শাখা রয়েছে, কোনও ট্যাগ নেই) তবে আপনি সম্ভবত কাজটি করতে গিট রিবেস ব্যবহার করতে পারেন ।
নিম্নলিখিত কমান্ডগুলিতে কমিটের অবজেক্টের নাম (SHA-1 হ্যাশ) "A" এর পরিবর্তে ব্যবহার করুন। আপনি যখন গিট কমিট পরিচালনা করেন তখন একটি "তারিখ ওভাররাইড" পদ্ধতি ব্যবহার করতে ভুলবেন না ।
---A---B---C---o---o---o master
git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit
---A---N (was ",new-commit", but we delete the tag)
\
B'---C'---o---o---o master
আপনি যদি নতুন ফাইল অন্তর্ভুক্ত করতে A আপডেট করতে চান (যেখানে এটি যুক্ত হয়েছিল সেখানে নতুন প্রতিশ্রুতি তৈরি করার git commit --amend
পরিবর্তে ), তার পরিবর্তে ব্যবহার করুন git commit
। ফলাফলটি দেখতে এই রকম হবে:
---A'---B'---C'---o---o---o master
উপরেরগুলি ততক্ষণ কাজ করে যতক্ষণ আপনি এই প্রতিশ্রুতিটির নাম দিতে পারেন যা আপনার নতুন প্রতিশ্রুতির পিতামাতার হওয়া উচিত। আপনি যদি সত্যিই নিজের নতুন ফাইলটি নতুন মূল প্রতিশ্রুতি (পিতামাতা নন) এর মাধ্যমে যুক্ত করতে চান তবে আপনার কিছুটা আলাদা প্রয়োজন:
B---C---o---o---o master
git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root
N (was new-root, but we deleted it)
\
B'---C'---o---o---o master
git checkout --orphan
তুলনামূলকভাবে নতুন (গিট 1.7.2), তবে গিটের পুরানো সংস্করণগুলিতে একই জিনিসটি করার অন্যান্য উপায় রয়েছে ।
একটি মাল্টি- একটি ফাইল সন্নিবেশ করানো হচ্ছে সুত্র ইতিহাস
যদি আপনার ভাণ্ডারগুলি আরও জটিল হয় (যেমন এটির একাধিক রেফ রয়েছে (শাখা, ট্যাগ, ইত্যাদি)), তবে আপনার সম্ভবত গিট ফিল্টার-শাখা ব্যবহার করা দরকার । গিট ফিল্টার-শাখা ব্যবহার করার আগে আপনার পুরো সংগ্রহস্থলের একটি ব্যাকআপ কপি তৈরি করা উচিত। আপনার সম্পূর্ণ কার্যকারী গাছের একটি সহজ টার সংরক্ষণাগার (.git ডিরেক্টরি সহ) যথেষ্ট। গিট ফিল্টার-শাখা ব্যাকআপ রেফগুলি তৈরি করে, তবে কেবল আপনার .git
ডিরেক্টরিটি মুছে ফেলা এবং এটি আপনার ব্যাকআপ থেকে পুনরুদ্ধার করে খুব সহজেই ডান ফিল্টারিং থেকে পুনরুদ্ধার করা সহজ ।
দ্রষ্টব্য: নীচের উদাহরণগুলি git update-index --add
পরিবর্তে নিম্ন-স্তরের কমান্ড ব্যবহার করে git add
। আপনি গিট অ্যাড ব্যবহার করতে পারেন , তবে আপনাকে প্রথমে কোনও বাহ্যিক অবস্থান থেকে প্রত্যাশিত পথে কপি করতে হবে ( --index-filter
খালি একটি অস্থায়ী GIT_WORK_TREE এ এর কমান্ড চালায়)।
যদি আপনি চান যে আপনার নতুন ফাইলটি বিদ্যমান বিদ্যমান প্রতিশ্রুতিতে যুক্ত করা যায় তবে আপনি এটি করতে পারেন:
new_file=$(git hash-object -w path/to/file)
git filter-branch \
--index-filter \
'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
--tag-name-filter cat \
-- --all
git reset --hard
বিদ্যমান কমিটের তারিখগুলি পরিবর্তনের কোনও কারণ আমি সত্যিই দেখতে পাচ্ছি না --env-filter 'GIT_AUTHOR_DATE=…'
। আপনি যদি এটি ব্যবহার করে থাকেন তবে আপনি এটি শর্তযুক্ত করে তুলবেন যাতে এটি প্রতিটি প্রতিশ্রুতির জন্য তারিখটি পুনরায় লিখন করে।
আপনি যদি চান যে আপনার নতুন ফাইলটি বিদ্যমান কিছু প্রতিশ্রুতিবদ্ধ ("এ") এর পরে কেবল কমিটগুলিতে উপস্থিত হয়, তবে আপনি এটি করতে পারেন:
file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
--index-filter '
if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
test -n "$x"; then
git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
fi
' \
--tag-name-filter cat \
-- --all
git reset --hard
যদি আপনি চান ফাইলকে একটি নতুন মাধ্যমে যুক্ত করার জন্য যদি কমিট যে আপনার ইতিহাস মাঝখানে সন্নিবেশিত করা হয়, তাহলে আপনি নতুন জেনারেট করতে কমিট করতে হবে ব্যবহার করার পূর্বে Git ফিল্টার-শাখা যোগ --parent-filter
করার Git ফিল্টার-শাখা :
file_path=path/to/file
before_commit=$(git rev-parse --verify A)
git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -
git filter-branch \
--parent-filter "sed -e s/$before_commit/$new_commit/g" \
--index-filter '
if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
test -n "$x"; then
git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
fi
' \
--tag-name-filter cat \
-- --all
git reset --hard
এছাড়াও আপনি ফাইল প্রথমে একটি নতুন মূল যোগ কমিট করা ব্যবস্থা করতে পারে: থেকে "অনাথ" পদ্ধতির মাধ্যমে কমিট আপনার নতুন রুট তৈরি Git রি-বেসের ফলে অধ্যায় (এটা মধ্যে ক্যাপচার new_commit
), নিঃশর্ত ব্যবহার --index-filter
, এবং একটি --parent-filter
মত "sed -e \"s/^$/-p $new_commit/\""
।