গিটের সাথে ফাইল কপি অপারেশন রেকর্ড করুন


141

আমি যখন গিট-এমভি ব্যবহার করে গিটে একটি ফাইল স্থানান্তরিত করি তখন স্থিতিটি দেখায় যে ফাইলটির নাম পরিবর্তন করা হয়েছে এবং আমি কিছু অংশ পরিবর্তন করলেও এটি এখনও প্রায় একই জিনিস হিসাবে বিবেচিত হয় (এটি ভাল কারণ এটি আমাকে এর ইতিহাস অনুসরণ করতে দেয়) ।

আমি যখন কোনও ফাইল অনুলিপি করি তখন মূল ফাইলটির কিছু ইতিহাস থাকে আমি নতুন অনুলিপিটির সাথে যুক্ত হতে চাই।

আমি ফাইলটি সরানোর চেষ্টা করে তারপরে মূল অবস্থানটিতে পুনরায় চেকআউট করার চেষ্টা করেছি - একবার সরানো গিট আমাকে আসল অবস্থানটি চেকআউট করতে দেবে না।

আমি একটি ফাইল সিস্টেমের অনুলিপি করার চেষ্টা করেছি এবং তারপরে ফাইলটি যুক্ত করব - গিট এটি একটি নতুন ফাইল হিসাবে তালিকাবদ্ধ করে।

গিট রেকর্ড ফাইল ফাইল অনুলিপি / মুভির যেখানে ফাইলটি পুনরায় নামকরণ / মুভ রেকর্ড করে সেখানে ইতিহাস ফাইলটি মূল ফাইলটিতে ফিরে পাওয়া যায় তার অনুরূপভাবে কোনও উপায় আছে?

উত্তর:


112

গিট পুনরায় নামকরণ ট্র্যাকিং করে না অনুলিপি ট্র্যাকিং করে না, যার অর্থ এটি নাম এবং অনুলিপি রেকর্ড করে না । পরিবর্তে এটি যা করে তা হ'ল নামকরণ এবং অনুলিপি সনাক্তকরণ । আপনি পুনঃনামকরণ সনাক্তকরণ অনুরোধ করতে পারেন git diff(এবং git showব্যবহারের মাধ্যমে) -Mবিকল্প, আপনি অতিরিক্ত কপি সনাক্তকরণ পরিবর্তিত ফাইল ব্যবহার করে অনুরোধ করতে পারেন -Cবিকল্প ( -Cবোঝা -M), এবং আপনার সাথে সব ফাইল মধ্যে আরো ব্যয়বহুল কপি সনাক্তকরণ অনুরোধ করতে পারেন --find-copies-harderবা -C -Cযা বোঝা ( -Cযা বোঝা যায়, -M)। দেখুন Git-পরিবর্তন র manpage।

এছাড়াও, আপনি কনফিগার Git সবসময় সেটিং দ্বারা পুনঃনামকরণ সনাক্তকরণ না diff.renamesএকটি বুলিয়ান সত্য মান (যেমন করতে trueবা 1), এবং আপনি এটা সেট করে খুব কপি সনাক্তকরণ করতে Git অনুরোধ করতে পারেন copyবা copies। দেখুন Git-কনফিগ র manpage।

এছাড়াও চেক -lকরার অপশন git diffও সংশ্লিষ্ট কনফিগ পরিবর্তনশীল diff.renameLimit


নোট করুন যে git log <pathspec>গিটে আলাদাভাবে কাজ করে: এখানে <pathspec>পাথ ডেলিমিটারগুলির সেট রয়েছে, যেখানে পাথটি একটি (সাব) ডিরেক্টরি নাম হতে পারে। নতুন নামকরণ এবং অনুলিপি সনাক্তকরণ কার্যকর হওয়ার আগে এটি ইতিহাস ফিল্টার করে ও সরল করে । আপনি যদি নাম এবং অনুলিপিগুলি অনুসরণ করতে চান তবে ব্যবহার করুন git log --follow <filename>(যা বর্তমানে কিছুটা সীমাবদ্ধ এবং কেবলমাত্র একক ফাইলের জন্য কাজ করে)।


1
@allyourcode: আপনি কী নিয়ে বিভ্রান্ত? ডিফল্টরূপে অনুলিপি সনাক্তকরণ চালু করতে আপনি সেট diff.renamesকরেছেন copies(যেমন ' git config diff.renames copies')। আমি একমত যে এটি কিছুটা প্রতিদ্বন্দ্বী।
জাকুব নরবস্কি

আমি যে বিভাগটি পার্স করতে পারছি বলে মনে হয় না তা হ'ল "এবং আপনি ডিফল্টরূপে সনাক্তকরণের নামও পরিবর্তন করতে অনুরোধ করতে পারেন"। আপনি কি বলছেন যে এখানে চারটি মান রয়েছে যা পৃথক নামগুলি ব্যবহার করতে পারে (সত্য, 1, অনুলিপি, অনুলিপি), এবং তারা সবাই একই জিনিস করে?
এলিওরকোড

1
@ ওলিওর কোড: আমি দুঃখিত, আমি এটি লক্ষ্য করি নি have এখনই স্থির, ধন্যবাদ।
জাকুব নরবস্কি

4
@ পেছা: গিট সামগ্রী সংগ্রহস্থল হিসাবে সামগ্রী-সম্বোধনকৃত অবজেক্ট ডাটাবেস ব্যবহার করে। ফাইলের বিষয়বস্তু ঠিকানার অধীনে 'ব্লব' বিষয়বস্তুতে সংরক্ষণ করা হয় যা SHA-1 সামগ্রীর হ্যাশ (ভাল, + দৈর্ঘ্য + বিষয়বস্তু টাইপ করুন)। এর অর্থ এই যে প্রদত্ত সামগ্রীগুলি একবারে সংরক্ষণ করা হবে। নম্বর। গিট প্যাক ফর্ম্যাটটি ব্যবহার করে "বুপ" ব্যাকআপ সিস্টেম তৈরি করার পিছনে এই স্বয়ংক্রিয় প্রতিলিপিটি ছিল।
জাকুব নরবস্কি

1
নীচের সমাধানের বিপরীতে, এটি পরিসরে পরিবর্তনের ট্র্যাকিংয়ের সাথে কাজ করে না। গিট লগ এমন একটি ব্যাপ্তি যুক্তি ( git log -L123,456:file.xyz) দেয় যা সঠিকভাবে নামগুলি অনুসরণ করে তবে অনুলিপিগুলি দেয় না এবং আপনি সেই ক্ষেত্রে পাস করতে পারবেন না; এছাড়াও, এএএএএফসিটি, এটি গিট দোষ দিয়ে কাজ করে না।
ক্লিমেট

57

2020-05-19: নীচের সমাধানটিতে মূল ফাইলটির লগ পরিবর্তন না করা, মার্জ সংঘাত তৈরি না করা এবং খাটো হওয়ার সুবিধা রয়েছে।

আপনি গিটকে তিনটি কমিটে অনুলিপি করা ফাইলটির ইতিহাস সনাক্ত করতে বাধ্য করতে পারেন:

  • অনুলিপি করার পরিবর্তে, একটি নতুন শাখা স্যুইচ করুন এবং সরানো নতুন সেখানে অবস্থান ফাইল।
  • মূল ফাইলটি আবার যুক্ত করুন।
  • দ্রুত-অগ্রগামী বিকল্পের সাহায্যে নতুন শাখাটিকে মূল শাখায় মার্জ করুন --no-ff

(ক্রেডিটগুলি রেমন্ড চেনের কাছে যায় ))


পূর্বের সমাধানটির চারটি কমিট ছিল:

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

( Https://stackoverflow.com/a/44036771/1389680 থেকে সমাধান নেওয়া হয়েছে ))


7
সরলতা, ব্রিভিটি, ১০০% ... এই উত্তরটি হ'ল জনসেবা ... দৃষ্টিতে সমস্ত কিছুকে
প্রাধান্য দেওয়া

1
কি পার্থক্য moveএবং rename?
ভোভান

@ ভোভান আপনি কি এই সত্যটির কথা উল্লেখ করছেন যে ব্যাশে আপনি mvউভয় ক্রিয়াকলাপের জন্য ব্যবহার করবেন? আমি সেই ফাইলের জন্য 'মুভ' ব্যবহার করছিলাম যা ফাইলের ডিরেক্টরি পরিবর্তন করতে পারে এবং যেখানে নেই সেখানে 'পুনর্নবীকরণ' করতে পারে।
রবার্ট পোলাক

1
আমি এই (নতুন) রেসিপিটি অনুসরণ করার চেষ্টা করেছি এবং এটি কার্যকর হয়নি। আপনি যদি প্রকৃত আদেশগুলি প্রদর্শন করেন তবে এটি সাহায্য করবে।
গ্রেগ লিন্ডাহাল

@ রবার্টপোলাক আমি এর বিভিন্ন সংস্করণ চেষ্টা করেছি কিন্তু সেগুলি কার্যকর হয়নি। "ফাইলটি সরান" দ্বারা, আপনার অর্থ git mv orig new? "আসলটি পড়ে", আপনি কি বোঝাতে চেয়েছেন cp new orig && git add orig?
ᆼ ᆺ ᆼ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.