কিভাবে git সঙ্গে একটি নতুন ফাইল শুধুমাত্র অংশ মঞ্চ?



gitlab (4)

আমি গিট যোগ ভালবাসা - interteractive । এটি এখন আমার দৈনন্দিন কর্মপ্রবাহ অংশ।

সমস্যাটি অট্যাক্টেড ফাইলগুলির সাথে কাজ করে না বলে মনে হয়। আমি যা করতে চাই তা হল একটি নতুন ফাইল ট্র্যাক করা, তবে শুধুমাত্র এটির একটি অংশ যোগ করুন, অর্থাৎ এই নতুন ফাইলের কিছু অংশ এখনও স্টেজ করার জন্য প্রস্তুত নয়।

উদাহরণস্বরূপ, জিট অ্যাড-আই সহ, আমি প্যাচ বিকল্পটি চয়ন করতে এবং এমনকি নতুন কোডের অংশগুলি মঞ্চে ব্যক্তিগত কৃপণ সম্পাদনা করতে পারি, ডিবাগ কোড মন্তব্যগুলি অযাচিত করে ফেলে। আমি এই ভাবে কাজ করতে ভালোবাসি কারণ এটি স্পষ্ট করে তোলে যে মেগা প্যাচের জায়গাগুলি আমি বর্তমানে কাজ করছি, এখনও কাজ দরকার।

দুর্ভাগ্যবশত, আমি একটি অপ্রচলিত ফাইলের সাথে একই কাজ করতে সক্ষম বলে মনে হচ্ছে না। হয় আমি পুরো ফাইল, বা কিছুই স্টেজ। আমি যে পদ্ধতিটি ব্যবহার করেছি তা স্টেজিং বা এটি খালি অবস্থায় একটি নতুন ফাইল তৈরি করা, এবং তারপরে স্বাভাবিক ভাবে ব্যক্তিগত পরিবর্তনগুলি পরিচালনা করা। কিন্তু এই সমাধান একটি নোংরা হ্যাক মত মনে হয় এবং আমি ভুলে গেলে, বা আমার মন পরিবর্তন, এটা হতে চেয়ে আরো যন্ত্রণার সৃষ্টি করে।

সুতরাং প্রশ্ন হল: কিভাবে একটি নতুন ফাইলের শুধুমাত্র অংশটি মঞ্চে রাখতে হবে, যাতে এই নতুন ফাইলটি ট্র্যাক করা যায় তবে পুরো সামগ্রী বা তার সামগ্রীগুলির অংশগুলি অস্থিতিশীল করে ফেলে?


git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

সহজ ডেমো:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • ইঙ্গিত যদি আপনি নিশ্চিত হন যে 'খালি' e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 আপনার গিট অবজেক্ট ডাটাবেসে ইতিমধ্যে বিদ্যমান, তবে আপনি পরিবর্তে হ্যাশ e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 হার্ডকোড করতে পারেন। আমি যে করছেন সুপারিশ করবেন না
  • ইঙ্গিত যদি আপনি উইন্ডোজ এ থাকেন তবে সম্ভবত আপনি কেবল NUL: ব্যবহার করতে পারেন NUL: পরিবর্তে /dev/null অন্যথায়, echo -n '' | git hash-object --stdin -w মতো কিছু ব্যবহার করুন echo -n '' | git hash-object --stdin -w

এখন newfile খালি ব্লব হিসাবে নতুন newfile ধারণ করবে, এবং খালি ব্লব বস্তু ডাটাবেসের মধ্যে প্রবেশ করানো হয়েছে যদি এটি এখনও বিদ্যমান না থাকে:

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

এই আপনি চান কি সঠিকভাবে হওয়া উচিত। আমি খুব বুদ্ধিমান সূচক পরিচালনার জন্য ভিম ক্ষুধার্ত প্লাগইন সুপারিশ করতে পারেন ( Better গিট অ্যাড-পি দেখুন? )


হোয়া, সব update-index এবং hash-object ব্যবসা অত্যন্ত জটিল বলে মনে হয়। পরিবর্তে এই সম্পর্কে কিভাবে:

git add -N new_file
git add -i

git help add থেকে git help add :

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.

এটি করার সবচেয়ে সহজ উপায় (এবং সাধারণভাবে আইহো ইন্টারেক্টিভ স্টেজিং) git gui । এটা গিট সঙ্গে bundled আসে এবং গিট দ্বারা সমর্থিত প্রায় সব প্ল্যাটফর্মের উপর কাজ করা উচিত।

শুধু git gui চালান এবং একটি gui যে স্টেজিং এবং unstaging কৃপণ ব্যক্তি এবং এমনকি ট্র্যাক এবং untracked ফাইল একক লাইন পারবেন।


শুধু অন্য সম্ভাবনা রেকর্ডের জন্য: আমি ব্যবহার

git add -N file
git add -p file

এবং তারপর আপনি কৃপণ মঞ্চ, বা জায়গায় তাদের সম্পাদনা করতে পারেন।





git