উদ্দেশ্য
- ব্যবহার ( স্মার থেকে অনুপ্রাণিত , এক্সের্বো থেকে ধার করা )
git am
- অনুলিপি করা / সরানো ফাইলগুলির প্রতিশ্রুতিবদ্ধ ইতিহাস যুক্ত করুন
- এক ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে
- অথবা এক থেকে অন্য সংগ্রহস্থল
সীমাবদ্ধতা
- ট্যাগ এবং শাখা রাখা হয় না
- ইতিহাস পথের নাম পুনরায় নামকরণ (ডিরেক্টরি পুনরায় নামকরণ) কাটা হয়
সারসংক্ষেপ
- ইমেল ফর্ম্যাটে ব্যবহার করে ইতিহাস বের করুন
git log --pretty=email -p --reverse --full-index --binary
- ফাইল ট্রি পুনরায় সংগঠিত করুন এবং ফাইলের নাম আপডেট করুন
- ব্যবহার করে নতুন ইতিহাস যুক্ত করুন
cat extracted-history | git am --committer-date-is-author-date
1. ইমেল ফর্ম্যাটে ইতিহাস বের করুন
উদাহরণ: এর এক্সট্র্যাক্ট ইতিহাস file3
, file4
এবংfile5
my_repo
├── dirA
│ ├── file1
│ └── file2
├── dirB ^
│ ├── subdir | To be moved
│ │ ├── file3 | with history
│ │ └── file4 |
│ └── file5 v
└── dirC
├── file6
└── file7
গন্তব্য সেট / পরিষ্কার করুন
export historydir=/tmp/mail/dir # Absolute path
rm -rf "$historydir" # Caution when cleaning the folder
ইমেল ফর্ম্যাটে প্রতিটি ফাইলের ইতিহাস বের করুন
cd my_repo/dirB
find -name .git -prune -o -type d -o -exec bash -c 'mkdir -p "$historydir/${0%/*}" && git log --pretty=email -p --stat --reverse --full-index --binary -- "$0" > "$historydir/$0"' {} ';'
দুর্ভাগ্যক্রমে বিকল্প --follow
বা --find-copies-harder
একত্রিত করা যায় না --reverse
। এই কারণেই ফাইলটি পুনরায় নামকরণ করা হলে (বা যখন কোনও পিতামহিত ডিরেক্টরি পুনরায় নামকরণ করা হয়) ইতিহাস কাটা হয়।
ইমেল ফর্ম্যাটে অস্থায়ী ইতিহাস:
/tmp/mail/dir
├── subdir
│ ├── file3
│ └── file4
└── file5
ড্যান বোনাচিয়া এই প্রথম পদক্ষেপে গিট লগ জেনারেশন কমান্ডের লুপগুলি উল্টানোর পরামর্শ দেয়: প্রতি ফাইল প্রতি একবার গিট লগ চালানোর পরিবর্তে কমান্ড লাইনে থাকা ফাইলগুলির তালিকা দিয়ে ঠিক একবার চালান এবং একক একীভূত লগ তৈরি করুন। এইভাবে প্রতিশ্রুতিবদ্ধ হয় যে একাধিক ফাইল পরিবর্তিত করা ফলাফলের মধ্যে একক প্রতিশ্রুতি থেকে যায় এবং সমস্ত নতুন কমিটি তাদের মূল আপেক্ষিক ক্রম বজায় রাখে। নোট করুন (এখন একীভূত) লগের মধ্যে ফাইলের নামগুলি লেখার সময় নীচের দ্বিতীয় ধাপেও এটি পরিবর্তন দরকার।
২. ফাইল ট্রি পুনরায় সংগঠিত করুন এবং ফাইলের নাম আপডেট করুন
মনে করুন আপনি এই তিনটি ফাইলকে এই অন্যান্য রেপোতে স্থানান্তরিত করতে চান (একই রেপো হতে পারে)।
my_other_repo
├── dirF
│ ├── file55
│ └── file56
├── dirB # New tree
│ ├── dirB1 # from subdir
│ │ ├── file33 # from file3
│ │ └── file44 # from file4
│ └── dirB2 # new dir
│ └── file5 # from file5
└── dirH
└── file77
সুতরাং আপনার ফাইলগুলি পুনর্গঠিত করুন:
cd /tmp/mail/dir
mkdir -p dirB/dirB1
mv subdir/file3 dirB/dirB1/file33
mv subdir/file4 dirB/dirB1/file44
mkdir -p dirB/dirB2
mv file5 dirB/dirB2
আপনার অস্থায়ী ইতিহাস এখন:
/tmp/mail/dir
└── dirB
├── dirB1
│ ├── file33
│ └── file44
└── dirB2
└── file5
ইতিহাসের মধ্যে ফাইলের নামও পরিবর্তন করুন:
cd "$historydir"
find * -type f -exec bash -c 'sed "/^diff --git a\|^--- a\|^+++ b/s:\( [ab]\)/[^ ]*:\1/$0:g" -i "$0"' {} ';'
৩. নতুন ইতিহাস প্রয়োগ করুন
আপনার অন্যান্য রেপো হ'ল:
my_other_repo
├── dirF
│ ├── file55
│ └── file56
└── dirH
└── file77
অস্থায়ী ইতিহাস ফাইলগুলি থেকে কমিটগুলি প্রয়োগ করুন:
cd my_other_repo
find "$historydir" -type f -exec cat {} + | git am --committer-date-is-author-date
--committer-date-is-author-date
আসল কমিট টাইম স্ট্যাম্পগুলি সংরক্ষণ করে ( ড্যান বোনাচের মন্তব্য)।
আপনার অন্যান্য রেপো এখন:
my_other_repo
├── dirF
│ ├── file55
│ └── file56
├── dirB
│ ├── dirB1
│ │ ├── file33
│ │ └── file44
│ └── dirB2
│ └── file5
└── dirH
└── file77
git status
চাপ দেওয়ার জন্য প্রস্তুত কমিটের পরিমাণ দেখতে ব্যবহার করুন :-)
অতিরিক্ত কৌশল: আপনার রেপোর মধ্যে নাম পরিবর্তন / সরানো ফাইলগুলি চেক করুন
নতুন নামকরণ করা ফাইলগুলি তালিকা করতে:
find -name .git -prune -o -exec git log --pretty=tformat:'' --numstat --follow {} ';' | grep '=>'
আরো কাস্টমাইজেশন: আপনি কমান্ড সম্পন্ন করতে পারবেন git log
বিকল্পগুলি ব্যবহার করে --find-copies-harder
বা --reverse
। আপনি cut -f3-
সম্পূর্ণ প্যাটার্ন '{। * =>। *}' ব্যবহার করে এবং গ্রেপিং করে প্রথম দুটি কলামও মুছে ফেলতে পারেন ।
find -name .git -prune -o -exec git log --pretty=tformat:'' --numstat --follow --find-copies-harder --reverse {} ';' | cut -f3- | grep '{.* => .*}'
git mv
: stackoverflow.com/questions/1094269/whats-the-purpose-of-git-mv