এই উত্তরটি git am
ধাপে ধাপে উদাহরণগুলির উপর ভিত্তি করে উপস্থাপিত আকর্ষণীয় কমান্ড সরবরাহ করে।
উদ্দেশ্য
- আপনি কিছু বা সমস্ত ফাইল একটি সংগ্রহস্থল থেকে অন্যটিতে সরিয়ে নিতে চান।
- আপনি তাদের ইতিহাস রাখতে চান।
- তবে আপনি ট্যাগ এবং শাখা রাখার বিষয়ে চিন্তা করেন না।
- নাম বদলে দেওয়া ফাইলগুলির (এবং নাম পরিবর্তিত ডিরেক্টরিগুলির ফাইলগুলিতে) সীমাবদ্ধ ইতিহাস আপনি গ্রহণ করেন।
কার্যপ্রণালী
- ইমেল ফর্ম্যাটে ব্যবহার করে ইতিহাস বের করুন
git log --pretty=email -p --reverse --full-index --binary
- ফাইল ট্রি পুনর্গঠিত করুন এবং ইতিহাসের ফাইল নাম পরিবর্তন আপডেট করুন [alচ্ছিক]
- ব্যবহার করে নতুন ইতিহাস প্রয়োগ করুন
git am
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
আপনার রেপো উত্স পরিষ্কার করুন
git commit ... # Commit your working files
rm .gitignore # Disable gitignore
git clean -n # Simulate removal
git clean -f # Remove untracked file
git checkout .gitignore # Restore gitignore
ইমেল ফর্ম্যাটে প্রতিটি ফাইলের ইতিহাস বের করুন
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
২. ফাইল ট্রি পুনর্গঠিত করুন এবং ইতিহাসের ফাইলের নাম পরিবর্তন করুন [alচ্ছিক]
মনে করুন আপনি এই তিনটি ফাইলকে এই অন্যান্য রেপোতে স্থানান্তরিত করতে চান (একই রেপো হতে পারে)।
my_other_repo
├── dirF
│ ├── file55
│ └── file56
├── dirB # New tree
│ ├── dirB1 # was subdir
│ │ ├── file33 # was file3
│ │ └── file44 # was file4
│ └── dirB2 # new dir
│ └── file5 # = file5
└── dirH
└── file77
সুতরাং আপনার ফাইলগুলি পুনর্গঠিত করুন:
cd /tmp/mail/dir
mkdir dirB
mv subdir dirB/dirB1
mv dirB/dirB1/file3 dirB/dirB1/file33
mv dirB/dirB1/file4 dirB/dirB1/file44
mkdir 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
আপনার অন্যান্য রেপো এখন:
my_other_repo
├── dirF
│ ├── file55
│ └── file56
├── dirB ^
│ ├── dirB1 | New files
│ │ ├── file33 | with
│ │ └── file44 | history
│ └── dirB2 | kept
│ └── file5 v
└── dirH
└── file77
git status
চাপ দেওয়ার জন্য প্রস্তুত কমিটের পরিমাণ দেখতে ব্যবহার করুন :-)
দ্রষ্টব্য: ইতিহাসটি যেমন পথ এবং ফাইলের নাম পরিবর্তন প্রতিফলিত করতে পুনরায় রচনা করা হয়েছে:
(যেমন পূর্ববর্তী রেপোর মধ্যে অবস্থান / নামের সাথে তুলনা করা)
git mv
অবস্থান / ফাইলের নাম পরিবর্তন করার দরকার নেই ।
git log --follow
সম্পূর্ণ ইতিহাস অ্যাক্সেস করার প্রয়োজন নেই ।
অতিরিক্ত কৌশল: আপনার রেপোর মধ্যে পুনরায় নামকরণ / সরানো ফাইলগুলি সনাক্ত করুন
নতুন নামকরণ করা ফাইলগুলি তালিকা করতে:
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 '{.* => .*}'