গিটে ফাইলগুলি নাম / নামকরণ এবং তাদের ইতিহাস বজায় রাখা কি সম্ভব?


667

আমি গিটে একটি প্রকল্পের সাবট্রিটির নাম পরিবর্তন / স্থানান্তর করতে চাই এটি থেকে সরানো

/project/xyz

প্রতি

/components/xyz

আমি যদি কোনও সমতল ব্যবহার করি git mv project components, তবে সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাস xyz projectহারিয়ে যায়। ইতিহাসকে বজায় রেখে এ জাতীয় পদক্ষেপের কি কোনও উপায় আছে?



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

ডিরেক্টরিটির
পুনর্নবীকরণ

আমি এখানে একটি উত্তর লিখেছি। আমি আশা করি এটা কাজ করে. stackoverflow.com/questions/10828267/…
মাহমুত EFE

উত্তর:


651

গিট প্রতিশ্রুতিবদ্ধতার সাথে ক্রিয়াকলাপ চালিয়ে যাওয়ার পরিবর্তে নতুন নামগুলি সনাক্ত করে, যাতে আপনি ব্যবহার করুন git mvবা mvতাতে কিছু আসে যায় না।

logকমান্ড একটি লাগে --followযুক্তি করে একটি পুনঃনামকরণ অপারেশন সামনে ইতিহাস অব্যাহত, অর্থাৎ, এটি একই ধরণের বিষয়বস্তু হিউরিস্টিক ব্যবহার করার জন্য অনুসন্ধান করে:

http://git-scm.com/docs/git-log

সম্পূর্ণ ইতিহাস অনুসন্ধান করতে, নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

git log --follow ./path/to/file

63
আমি সন্দেহ করি এটি একটি পারফরম্যান্স বিবেচনা। আপনার যদি পুরো ইতিহাসের প্রয়োজন না হয় তবে অবশ্যই সামগ্রীটি স্ক্যান করতে আরও সময় লাগবে। সবচেয়ে সহজ উপায় হ'ল একটি নাম উপস্থাপন git config alias.logf "log --follow"এবং কেবল লিখুন git logf ./path/to/file
ট্রয়েস থমসন

13
@ ট্রয়েলস থমসন এই উত্তরটি থেকে লিনাস টোরভাল্ডসের এই ইমেলটি যুক্ত করেছেন , এটি ইঙ্গিত দিয়েছিলেন যে এটি গীতের পছন্দসই ডিজাইনের পছন্দ, কারণ এটির নামকরণ ট্র্যাকিংয়ের চেয়ে অনেক বেশি শক্তিশালী
এমিল লুন্ডবার্গ

127
এই উত্তরটি কিছুটা বিভ্রান্তিকর। গিট "নতুন নামগুলি সনাক্ত করতে পারে" তবে গেমটিতে খুব দেরী করে; প্রশ্নটি জিজ্ঞাসা করছে যে কীভাবে আপনি গিট ট্র্যাকগুলির নামগুলি নিশ্চিত করেন এবং এটি পড়ার কেউ সহজেই অনুমান করতে পারে যে গিট এগুলি আপনার জন্য স্বয়ংক্রিয়ভাবে সনাক্ত করে এবং এটি নোট করে। এটা না. গিটের পুনরায় নামগুলির কোনও হ্যান্ডলিং নেই, এবং এর পরিবর্তে এমন একীকরণ / লগ সরঞ্জাম রয়েছে যা ঘটেছিল তা বের করার চেষ্টা করে - এবং খুব কমই এটি সঠিকভাবে পায় get লিনাসের একটি ভুল তবে তীব্র যুক্তি রয়েছে কেন গিটটি কখনই এটি সঠিক উপায়ে করা উচিত নয় এবং স্পষ্টতই নামগুলি ট্র্যাক করে। সুতরাং, আমরা এখানে আটকে আছি।
ক্রিস মোসচিনি

29
গুরুত্বপূর্ণ: উদাহরণস্বরূপ জাভা প্যাকেজের নাম পরিবর্তনের সময় আপনি যদি কোনও ডিরেক্টরিটির নাম পরিবর্তন করেন, তবে প্রথমে 'git mv {old} {new}' কমান্ডের জন্য দুটি কমিট কার্যকর করতে ভুলবেন না, যা সব জাভা ফাইলের আপডেটের জন্য দ্বিতীয়টি উল্লেখ করে প্যাকেজ ডিরেক্টরি পরিবর্তন। অন্যথায় গিট পৃথক ফাইলগুলি - ফলো প্যারামিটার দিয়েও ট্র্যাক করতে পারে না।
nn4l

44
যদিও লিনাস সম্ভবত খুব কম ভুল করেছে তবে এটি এক হিসাবে দেখা যাচ্ছে। কেবল একটি ফোল্ডারটির নামকরণের কারণে গিটহাবে একটি বিশাল ব-দ্বীপ আপলোড হয়। যা আমাকে আমার ফোল্ডারগুলির নাম পরিবর্তনের বিষয়ে সতর্ক করে তোলে ... তবে এটি একটি প্রোগ্রামারের পক্ষে বেশ বড় স্ট্রেট জ্যাকেট। মাঝে মাঝে, আমি কোনও কিছুর অর্থ পুনরায় সংজ্ঞায়িত করতে পারি বা কীভাবে জিনিসগুলিকে শ্রেণিবদ্ধ করা হয় তা পরিবর্তন করতে পারি। লিনাস: "অন্য কথায়, আমি ঠিক আছি I'm আমি সবসময় সঠিক, তবে কখনও কখনও আমি অন্য সময়ের চেয়েও বেশি সঠিক। TM)। " ... সে সম্পর্কে আমার সন্দেহ আছে।
গ্যাবে হালসমার

94

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

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

এখন, যেহেতু আপনি এখনও আমার সাথে রয়েছেন, আপনি সম্ভবত একক বিকাশকারী সম্পূর্ণ বিচ্ছিন্ন ফাইলটির নাম পরিবর্তন করছেন। ব্যবহার করে একটি ফাইল সরানো যাক filter-tree!

ধরুন আপনি একটি ফাইল oldএকটি ফোল্ডারে স্থানান্তরিত করতে যাচ্ছেন dirএবং নামটি দিনnew

এটি দিয়ে করা যেতে পারে git mv old dir/new && git add -u dir/newতবে এটি ইতিহাসকে ভেঙে দেয়।

পরিবর্তে:

git filter-branch --tree-filter 'if [ -f old ]; then mkdir dir && mv old dir/new; fi' HEAD

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

সম্পূর্ণ হয়ে গেলে, ফাইলটি সরানো হয় এবং লগটি অক্ষত থাকে। আপনি একটি নিনজা জলদস্যু মত মনে হয়।

এছাড়াও; অবশ্যই যদি আপনি ফাইলটিকে একটি নতুন ফোল্ডারে স্থানান্তরিত করেন তবে অবশ্যই mkdir dir প্রয়োজন। যদি ইতিহাসে এর আগে এই ফোল্ডারটি সৃষ্টির এড়াতে হবে চেয়ে আপনার ফাইল আগে থেকেই আছে।


57
একটি অবসেসিভ গিট-লগ-প্রেমিকা হিসাবে, আমি এই জন্য যাব না। সেই সময়গুলিতে ফাইলগুলির নাম দেওয়া হয়নি, অতএব ইতিহাস একটি অস্তিত্বহীন পরিস্থিতি প্রতিফলিত করে। অতীতে কী পরীক্ষা ভঙ্গ হতে পারে কে জানে! আগের সংস্করণগুলি ভাঙার ঝুঁকিটি প্রতিটি ক্ষেত্রেই এটির পক্ষে উপযুক্ত নয়।
ভিনসেন্ট

7
@ ভিনসেন্ট আপনি একেবারে সঠিক, এবং আমি এই সমাধানটি যথাযথ হওয়ার অপছন্দ সম্পর্কে যতটা সম্ভব পরিষ্কার করার চেষ্টা করেছি। আমি আরও মনে করি আমরা এই ক্ষেত্রে "ইতিহাস" শব্দের দুটি অর্থ সম্পর্কে কথা বলছি, আমি উভয়ের প্রশংসা করি।
inসিস্টিন স্টিমলার 13

6
আমি মনে করি এমন পরিস্থিতি রয়েছে যেখানে একজনের এটির প্রয়োজন হতে পারে। বলুন আমি আমার নিজস্ব ব্যক্তিগত শাখায় এমন কিছু বিকাশ করেছি, যা এখন আমি প্রবাহে মিশ্রিত করতে চাই। তবে আমি আবিষ্কার করেছি, ফাইলের নাম উপযুক্ত নয়, তাই আমি এটি আমার সম্পূর্ণ ব্যক্তিগত শাখার জন্য পরিবর্তন করি। এইভাবে আমি একটি পরিষ্কার সঠিক ইতিহাস রাখতে পারি এবং শুরু থেকেই সঠিক নাম রাখতে পারি।
ব্যবহারকারী 2291758

3
@ ব্যবহারকারী 2291758 এটি আমার ব্যবহারের কেস। এই আরও শক্তিশালী গিট কমান্ডগুলি বিপজ্জনক তবে এর অর্থ এই নয় যে আপনি কী করছেন তা যদি জানেন তবে তাদের কাছে খুব বাধ্যমূলক ব্যবহারের কেস নেই!
ফিলিক্স

1
যদি সম্ভব হয় তবে --index-filterনামগুলির জন্য ব্যবহার করা আরও ত্বরান্বিত হবে কারণ গাছটি পরীক্ষা করে দেখতে হবে না এবং প্রতিটি প্রতিশ্রুতি দিয়ে ফিরে আসতে হবে। --index-filterপ্রতিটি কমিট সূচকে সরাসরি কাজ করে।
থমাস গিয়ট-সিওনেস্ট

87

না।

সংক্ষিপ্ত উত্তরটি হ'ল না । গিটে কোনও ফাইলের নাম পরিবর্তন করা এবং ইতিহাস মনে রাখা সম্ভব নয়। এবং এটি একটি ব্যথা হয়।

গুজব রয়েছে যে এটি git log --follow--find-copies-harderকাজ করবে, তবে এটি ফাইলের বিষয়বস্তুগুলিতে শূন্য পরিবর্তন রয়েছে এবং মুভগুলি দিয়ে করা হয়েছে তা আমার পক্ষে কাজ করে না git mv

(প্রথমদিকে আমি এক্রিপ্সায় একটি ক্রিয়াকলাপের প্যাকেজগুলির নাম পরিবর্তন করতে এবং আপডেট করতে ব্যবহার করেছি, যা গিটকে বিভ্রান্ত করেছে But তবে এটি করা খুব সাধারণ বিষয় --followonly কাজটি মনে হয় যদি কেবল একটি mvসম্পাদিত হয় এবং তখন commitএটি mvখুব বেশি দূরে থাকে না))

লিনাস বলেছেন যে আপনি কোনও সফ্টওয়্যার প্রকল্পের সামগ্রিক বিষয়টিকে সামগ্রিকভাবে বোঝার কথা, পৃথক ফাইলগুলি ট্র্যাক করার দরকার নেই। ঠিক আছে, দুঃখের বিষয়, আমার ছোট মস্তিষ্ক এটি করতে পারে না।

এটি সত্যিই বিরক্তিকর যে এত লোক মূর্খতার সাথে বিবৃতিটি পুনরুদ্ধার করেছেন যে গিট স্বয়ংক্রিয়ভাবে চলাচলগুলি ট্র্যাক করে। তারা আমার সময় নষ্ট করেছে। গিট এমন কোনও কাজ করে না। ডিজাইন দ্বারা (!) গিট মোটেও চলাচল করে না।

আমার সমাধান হ'ল ফাইলগুলি তাদের মূল অবস্থানগুলিতে পুনরায় নামকরণ করা। উত্স নিয়ন্ত্রণে ফিট করার জন্য সফ্টওয়্যারটি পরিবর্তন করুন। গিটের সাথে আপনাকে ঠিক প্রথমবার "গিট" করা দরকার বলে মনে হচ্ছে।

দুর্ভাগ্যক্রমে, এটি গ্রহটিকে ভেঙে দেয়, যা এটি ব্যবহার করে বলে মনে হচ্ছে --followgit log --followকখনও কখনও জটিল পুনরায় নামকরণের ইতিহাস সহ ফাইলগুলির সম্পূর্ণ ইতিহাস প্রদর্শন করে না git logdoes (আমি জানিনা কেন.)

(কিছু অতি চালাক হ্যাক রয়েছে যা ফিরে এসে পুরানো কাজগুলি পুনরায় স্বীকার করতে পারে তবে তারা বরং ভীতু


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

6
গিট -১, উপবর্তন +১
কসমিন

এটা কি এখনও সত্য? আমার জন্য আপাতত টিএফএসের সাথে থাকার আরও কারণ এটি একটি বড় প্রকল্পে মুভি / নাম পরিবর্তিত ফাইলের ইতিহাস রাখা আবশ্যক।
সিজার

@ সিজার যদি "ইতিহাস মনে রাখে", তার অর্থ "লগ দেখার সময় পুনরায় নামগুলি অনুসরণ করুন" (যা আমাদের কেবলমাত্র দরকারী বিষয় যা আমাদের যত্ন নেওয়া উচিত), তবে এটি কখনই সত্য ছিল না ! গিট নতুন নামগুলি "রেকর্ড" করে না, তবে সরঞ্জামগুলি সহজেই সেগুলি সনাক্ত করতে পারে এবং আমাদের নাম এবং চালচলনের সাথে উপস্থাপন করতে পারে। যদি কারও জন্য এটি "কাজ করে না", তবে তার / সে যে সরঞ্জামগুলি ব্যবহার করছে সেগুলি পরিবর্তন করা উচিত। এখানে অনেকগুলি দুর্দান্ত গিট জিইউআই রয়েছে যা এই ক্ষমতা রাখে।
মোহাম্মদ দেহাগান

সংক্ষিপ্ত উত্তর হল হ্যাঁ. গিট বর্তমান সংস্করণ "গিট লগ - ফলো" সমর্থন করে। এবং আমি @ মোহাম্মদদেহহানের সাথে একমত
ইনসুং

42
git log --follow [file]

নতুন নামগুলির মাধ্যমে আপনাকে ইতিহাস প্রদর্শন করবে।


29
এটি প্রদর্শিত হয় যে আপনি ফাইলটি সংশোধন করা শুরু করার আগে আপনাকে কেবল পুনরায় নামকরণের প্রয়োজন। আপনি যদি ফাইলটি (শেলের মধ্যে) সরিয়ে নিয়ে যান এবং তারপরে পরিবর্তন করেন তবে সমস্ত বেট বন্ধ রয়েছে।
yoyo

22
@ ইয়য়ো: এ কারণেই গিট নাম পরিবর্তন করে না, এটি তাদের সনাক্ত করে। একটি git mvমূলত একটি git rm && git add। কোনও ফাইলের 90% অভিন্ন হলে পুনরায় নামকরণ করার জন্য -M90/ --find-renames=90বিবেচনার মতো বিকল্প রয়েছে ।
vdboor

22

আমি করি:

git mv {old} {new}
git add -u {new}

3
আপনি আমার জন্য কিছু করছেন বলে মনে হয় না, মনে হয় ইতিহাসটি আপডেট করা যায়?
জেরেমি

1
-Aপরিবর্তে আপনি সম্ভবত আচরণ চান ? আবার, এখানে দেখুন: git-scm.com/docs/git-add
জেমস এম গ্রিন

1
এটি ফাইলগুলি যুক্ত করে, তবে এটি ইতিহাস আপডেট করে না যাতে 'গিট লগ ফাইলের নাম' পুরো ইতিহাসটি দেখায়। এটি কেবলমাত্র পুরো ইতিহাসটি দেখায় যদি আপনি এখনও - ফলো বিকল্পটি ব্যবহার করেন।
জেরেমি

3
আমি একটি জটিল রিফ্যাক্টর করেছি যা একটি অন্তর্ভুক্ত ডিরেক্টরি (এমভি ব্যবহার করে, গিট এমভি ব্যবহার করে না) সরানো হয়েছিল এবং তারপরে নাম পরিবর্তন করা ফাইলগুলির মধ্যে প্রচুর # অন্তর্ভুক্ত পথ পরিবর্তন করে। ইতিহাস ট্র্যাক করার জন্য গিট যথেষ্ট মিল খুঁজে পেল না। তবে গিট অ্যাড-ইউ ছিল আমার প্রয়োজনীয় জিনিস। গিট স্ট্যাটাসটি এখন "পুনরায় নামকরণ" নির্দেশ করে যেখানে এটি "মুছে ফেলা" এবং "নতুন ফাইল" দেখানোর আগে।
অ্যান্ডি জাস্ট

1
এসও তে প্রচুর প্রশ্ন রয়েছে যা এর উদ্দেশ্য সম্পর্কে সম্বোধন করে git add -u। গিট ডকসগুলি অস্বাস্থ্যকর হতে থাকে এবং আমি দেখতে চাই এমন শেষ স্থান। এখানে git add -uপদক্ষেপ কার্যকর হচ্ছে: স্ট্যাকওভারফ্লো . com / a / 2117202
নবার

17

আমি গিটে একটি প্রকল্পের সাবট্রিটির নাম পরিবর্তন / স্থানান্তর করতে চাই এটি থেকে সরানো

/project/xyz

প্রতি

/ উপাদান / Xyz

যদি আমি কোনও সমতল ব্যবহার করি git mv project components, তবে xyzপ্রকল্পের জন্য সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাস হারিয়ে যায়।

না (8 বছর পরে, গিট 2.19, কিউ 3 2018), কারণ গিট ডিরেক্টরিটির নতুন নামটি সনাক্ত করবে এবং এটি এখন আরও ভাল নথিভুক্ত।

দেখুন b00bf1c কমিট , 1634688 কমিট , 0661e49 কমিট , 4d34dff কমিট , 983f464 কমিট , c840e1a কমিট , কমিট 9929430 (27 জুন 2018), এবং d4e8062 কমিট , 5dacd4a কমিট দ্বারা (25 জুন 2018) ইলিয়াস Newren ( newren)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 0ce5a69 , 24 জুলাই 2018)

এটি এখন ব্যাখ্যা করা হয়েছে Documentation/technical/directory-rename-detection.txt:

উদাহরণ:

যখন সমস্ত x/a, x/bএবং x/cসরানো হয়েছে z/a, z/bএবং z/c, সম্ভবত এটির x/dমধ্যে যুক্ত হয়েছে এটিও z/dপুরো ডিরেক্টরিটি ' x' এ 'সরানো হয়েছে বলে ইঙ্গিতটি নিয়ে সরে যেতে চাইবে z

তবে এগুলি আরও অনেকগুলি মামলা, যেমন:

ইতিহাসের একদিকের নাম পুনরায় নামকরণ করে x -> z, এবং অন্যটি কিছু ফাইলের পুনরায় নামকরণ করে x/e, যার ফলে সংহতকরণের জন্য একটি ট্রানজিটিভ নতুন নামকরণের প্রয়োজন হয়।

ডিরেক্টরি পুনরায় নামকরণ সনাক্তকরণকে সহজ করার জন্য, এই বিধিগুলি গিট দ্বারা প্রয়োগ করা হয়:

ডিরেক্টরি পুনরায় নামকরণ সনাক্তকরণ প্রযোজ্য হলে কয়েকটি প্রাথমিক নিয়ম সীমা:

  1. যদি কোনও প্রদত্ত ডিরেক্টরিটি এখনও একীভূত হওয়ার উভয় পক্ষেই বিদ্যমান থাকে তবে আমরা এটির নামকরণ হয়েছে বলে বিবেচনা করি না।
  2. নতুন নামকরণ করা ফাইলগুলির একটি উপসেটের যদি কোনও ফাইল বা ডিরেক্টরি থাকে (বা একে অপরের পথে থাকত) তবে সেই নির্দিষ্ট সাব-পাথের ডিরেক্টরি নামটি "বন্ধ করুন" এবং ব্যবহারকারীর কাছে দ্বন্দ্বের খবর দিন ।
  3. যদি ইতিহাসের অন্য দিকের কোনও ডিরেক্টরি যদি আপনার ইতিহাসের পার্শ্বটির নাম পরিবর্তনের পরিবর্তে কোনও নাম পরিবর্তন করে থাকে তবে ইতিহাসের অন্য দিক থেকে সেই নির্দিষ্ট নামটি কোনও উপেক্ষা ডিরেক্টরি নাম (তবে ব্যবহারকারীকে সতর্ক করুন) এর জন্য উপেক্ষা করুন warn

আপনি এর মধ্যে অনেকগুলি পরীক্ষা দেখতে পারেন t/t6043-merge-rename-directories.shযা এটিও নির্দেশ করে:

  • ক) যদি নামগুলি কোনও ডিরেক্টরিকে দুটি বা আরও বেশিতে বিভক্ত করে, সর্বাধিক নাম, ডিরেক্টরি "জয়" দিয়ে ডিরেক্টরি।
  • খ) কোনও পাথের জন্য ডিরেক্টরি-পুনর্নবীকরণ-সনাক্তকরণ এড়ান, যদি সেই পথটি যদি একত্রিত হওয়ার উভয় পাশের পুনর্নবীকরণের উত্স হয়।
  • গ) ইতিহাসের অন্য দিকটি যদি নাম পরিবর্তন করে চলে তবে কেবল ডিরেক্টরিগুলিতে অন্তর্ভুক্ত ডিরেক্টরি নাম পরিবর্তন করুন।

15

উদ্দেশ্য

  • ব্যবহার ( স্মার থেকে অনুপ্রাণিত , এক্সের্বো থেকে ধার করা )git am
  • অনুলিপি করা / সরানো ফাইলগুলির প্রতিশ্রুতিবদ্ধ ইতিহাস যুক্ত করুন
  • এক ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে
  • অথবা এক থেকে অন্য সংগ্রহস্থল

সীমাবদ্ধতা

  • ট্যাগ এবং শাখা রাখা হয় না
  • ইতিহাস পথের নাম পুনরায় নামকরণ (ডিরেক্টরি পুনরায় নামকরণ) কাটা হয়

সারসংক্ষেপ

  1. ইমেল ফর্ম্যাটে ব্যবহার করে ইতিহাস বের করুন
    git log --pretty=email -p --reverse --full-index --binary
  2. ফাইল ট্রি পুনরায় সংগঠিত করুন এবং ফাইলের নাম আপডেট করুন
  3. ব্যবহার করে নতুন ইতিহাস যুক্ত করুন
    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 '{.* => .*}'

4
সতর্কতা: এই কৌশলটি পৃথক খণ্ডিত-কমিটগুলিতে 2 বা ততোধিক ফাইলগুলিকে পরিবর্তিত করে এমন কমিটগুলি বিভক্ত করে তোলে এবং তদুপরি ফাইলের নাম অনুসারে বাছাই করে তাদের ক্রমগুলি স্ক্র্যাম্বল করে (যাতে কোনও মূল প্রতিশ্রুতির টুকরো রৈখিক ইতিহাসের সাথে সংলগ্ন দেখা যায় না)। ফলস্বরূপ ইতিহাস কেবল ফাইল-বাই-ফাইলের ভিত্তিতে "" সঠিক "। যদি আপনি একাধিক ফাইল সরান, তবে ফলাফলের ইতিহাসে নতুন কমিটের কোনওটিই সরল রেপোর ইতিহাসে সরানো ফাইলগুলির একটি ধারাবাহিক স্ন্যাপশট উপস্থাপন করে।
ড্যান বোনাচিয়া

2
হাই @ ড্যানবোনচেয়া আপনার আকর্ষণীয় প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ। আমি এই কৌশলটি ব্যবহার করে বেশ কয়েকটি ফাইল সমন্বিত কিছু রেপগুলি সাফল্যের সাথে স্থানান্তরিত করেছি (এমনকি নাম পরিবর্তন করা ফাইল এবং ডিরেক্টরিগুলি জুড়ে সরানো ফাইলগুলি সহ)। আপনি এই উত্তরে কী পরিবর্তন করার পরামর্শ দিচ্ছেন। আপনি কি মনে করেন যে এই কৌশলটির সীমাবদ্ধতা ব্যাখ্যা করে আমাদের এই উত্তরের শীর্ষে একটি সতর্কতা ব্যানার যুক্ত করা উচিত? চিয়ার্স
ওলিব্রে

2
আমি এই কৌশলটি গিপ লগ জেনারেশন কমান্ডের লুপগুলিকে 1 ধাপে ইনভার্ট করে সমস্যা এড়াতে রূপান্তর করেছি e i। প্রতি ফাইল প্রতি একবার গিট লগ চালানোর পরিবর্তে, কমান্ড লাইনে থাকা ফাইলগুলির তালিকা দিয়ে ঠিক একবার চালান এবং একক একীভূত লগ তৈরি করুন। এইভাবে প্রতিশ্রুতিবদ্ধ হয় যে 2 বা ততোধিক ফাইল পরিবর্তিত হয় ফলাফলের মধ্যে একক প্রতিশ্রুতি থাকে এবং সমস্ত নতুন কমিটি তাদের মূল আপেক্ষিক ক্রম বজায় রাখে। নোট করুন (এখন একীভূত) লগে ফাইলের নামগুলি পুনরায় লেখার সময় এটি ধাপ 2 এ পরিবর্তনও প্রয়োজন। মূল কমিট টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য আমি গিট এএম - কমমিটার-ডেট-ইজ-রাইটার-ডেটও ব্যবহার করি।
ড্যান বোনাচিয়া

1
আপনার পরীক্ষা এবং ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। অন্যান্য পাঠকদের জন্য আমি উত্তরটি কিছুটা আপডেট করেছি। তবে আমি আপনার প্রক্রিয়াজাতকরণ পরীক্ষা করতে সময় নিয়েছি। আপনি যদি কমান্ড লাইনের উদাহরণ সরবরাহ করতে চান তবে দয়া করে এই উত্তরটি সম্পাদনা করতে দ্বিধা বোধ করুন। চিয়ার্স;)
ওলিব্রে

4

আমি এই বহু-পদক্ষেপ প্রক্রিয়াটি প্যারেন্ট ডিরেক্টরিতে এবং ইতিহাস বজায় রেখে কোডটি সরানোর জন্য অনুসরণ করেছি।

পদক্ষেপ 0: সুরক্ষার জন্য 'মাস্টার' থেকে একটি শাখা 'ইতিহাস' তৈরি করেছে

পদক্ষেপ 1: ইতিহাস পুনরায় লেখার জন্য গিট-ফিল্টার-রেপো সরঞ্জাম ব্যবহৃত হয়েছে । নীচের এই কমান্ডটি ফোল্ডার 'ফোল্ডারউইথ কনটেন্টঅফআইন্টারস্টেস্ট' এক স্তরে সরিয়ে নিয়েছে এবং সম্পর্কিত কমিটের ইতিহাস পরিবর্তন করেছে

git filter-repo --path-rename ParentFolder/FolderwithContentOfInterest/:FolderwithContentOfInterest/ --force

পদক্ষেপ 2: এই সময়ের মধ্যে গিটহাব সংগ্রহস্থলটি এর প্রত্যন্ত সংগ্রহস্থলটি হারিয়েছে। দূরবর্তী রেফারেন্স যুক্ত করা হয়েছে

git remote add origin git@github.com:MyCompany/MyRepo.git

পদক্ষেপ 3: সঞ্চিত্রে তথ্য টানুন

git pull

পদক্ষেপ 4: স্থানীয় হারিয়ে যাওয়া শাখাকে মূল শাখার সাথে সংযুক্ত করুন

git branch --set-upstream-to=origin/history history

পদক্ষেপ 5: যদি অনুরোধ করা হয় তবে ফোল্ডার কাঠামোর জন্য ঠিকানা সংহতকরণ বিরোধ

পদক্ষেপ 6: পুশ !!

git push

দ্রষ্টব্য: পরিবর্তিত ইতিহাস এবং সরানো ফোল্ডারটি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে। enter code here

সম্পন্ন. কোডটি ইতিহাসকে অক্ষত রেখে পিতামাত্রে / কাঙ্ক্ষিত ডিরেক্টরিতে চলে যায়!


2

গিটের মূল হলেও, গিট নদীর গভীরতানির্ণয় পুনর্নবীকরণের উপর নজর রাখে না, গিট লগ "চীনামাটির বাসন" দিয়ে আপনি যে ইতিহাসটি প্রদর্শন করেন তা যদি আপনি চান তবে এটি সনাক্ত করতে পারে।

প্রদত্ত git log-M বিকল্পের জন্য:

গিট লগ-পি-এম

গিটের বর্তমান সংস্করণ সহ।

এটি অন্যান্য কমান্ডের git diffজন্যও কাজ করে।

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

সিপিইউ ব্যবহারের জন্য যখনই আপনি গিটকে ফাইলগুলির নাম পরিবর্তন করা হয়েছে তা অনুসন্ধান করার জন্য ব্যয় করতে হয়, তাই আপনি এটি ব্যবহার করেন বা না করেন এবং কখন, আপনার উপর নির্ভর করে।

যদি আপনি সর্বদা কোনও নির্দিষ্ট সংগ্রহস্থলে পুনরায় নাম সনাক্তকরণের সাথে আপনার ইতিহাসের প্রতিবেদন করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

গিট কনফিগার

একটি ডিরেক্টরী থেকে অন্য চলন্ত ফাইল হয় সনাক্ত হয়েছে। এখানে একটি উদাহরণ:

commit c3ee8dfb01e357eba1ab18003be1490a46325992
Author: John S. Gruber <JohnSGruber@gmail.com>
Date:   Wed Feb 22 22:20:19 2017 -0500

    test rename again

diff --git a/yyy/power.py b/zzz/power.py
similarity index 100%
rename from yyy/power.py
rename to zzz/power.py

commit ae181377154eca800832087500c258a20c95d1c3
Author: John S. Gruber <JohnSGruber@gmail.com>
Date:   Wed Feb 22 22:19:17 2017 -0500

    rename test

diff --git a/power.py b/yyy/power.py
similarity index 100%
rename from power.py
rename to yyy/power.py

দয়া করে মনে রাখবেন যে আপনি যখনই কেবল ভিন্ন ব্যবহার করেন না তখনই এটি কাজ করে git log। উদাহরণ স্বরূপ:

$ git diff HEAD c3ee8df
diff --git a/power.py b/zzz/power.py
similarity index 100%
rename from power.py
rename to zzz/power.py

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

 $ git merge -v master
 Auto-merging single
 Merge made by the 'recursive' strategy.
  one => single | 4 ++++
  1 file changed, 4 insertions(+)
  rename one => single (67%)

ফলাফলটি ফাইলের নাম পরিবর্তন করে এবং উভয় পাঠ্য পরিবর্তন করে একটি কার্যকরী ডিরেক্টরি ছিল। সুতরাং গিটার পক্ষে এটি পরিষ্কারভাবে নাম পরিবর্তন করতে না পারার পরেও সঠিক কাজ করা সম্ভব।

এটি একটি পুরানো প্রশ্নের দেরী উত্তর তাই অন্যান্য উত্তরগুলি সেই সময়ে গিট সংস্করণের জন্য সঠিক হতে পারে।


1

প্রথমে কেবল একটি নাম পরিবর্তন করে একটি স্বতন্ত্র প্রতিশ্রুতি তৈরি করুন।

তারপরে ফাইলের সামগ্রীতে যে কোনও পরিবর্তন আসে তা পৃথক প্রতিশ্রুতি দেয়।


1

ডিরেক্টরি বা ফাইলটির নাম পরিবর্তন করতে (জটিল মামলার বিষয়ে আমি বেশি কিছু জানি না, তাই কিছু ক্যাভেট থাকতে পারে):

git filter-repo --path-rename OLD_NAME:NEW_NAME

এটি উল্লিখিত ফাইলগুলিতে একটি ডিরেক্টরিটির নাম পরিবর্তন করতে (কলব্যাক ব্যবহার করা সম্ভব, তবে কীভাবে আমি জানি না):

git filter-repo --replace-text expressions.txt

expressions.txtলাইনগুলিতে ভরা ফাইল literal:OLD_NAME==>NEW_NAME(এটি পাইথনের আরই ব্যবহার করে regex:বা এর সাথে গ্লোব করা সম্ভব glob:)।

কমিটের বার্তায় ডিরেক্টরিটির নামকরণ করতে:

git-filter-repo --message-callback 'return message.replace(b"OLD_NAME", b"NEW_NAME")'

পাইথনের নিয়মিত প্রকাশগুলিও সমর্থিত, তবে সেগুলি অবশ্যই পাইথনে লেখা উচিত।

রিপোজিটরিটি যদি আসল হয় তবে দূরবর্তী ছাড়া, আপনাকে --forceপুনরায় লেখার জন্য জোর করতে যোগ করতে হবে । (এটি করার আগে আপনি আপনার সংগ্রহস্থলের একটি ব্যাকআপ তৈরি করতে চাইতে পারেন))

আপনি যদি রেফগুলি সংরক্ষণ করতে না চান (সেগুলি গিট জিইউআইয়ের শাখার ইতিহাসে প্রদর্শিত হবে), আপনাকে যুক্ত করতে হবে --replace-refs delete-no-add


0

কেবল ফাইলটি এবং মঞ্চটি এখান দিয়ে সরান :

git add .

প্রতিশ্রুতি দেওয়ার আগে আপনি স্থিতিটি পরীক্ষা করতে পারেন:

git status

এটি প্রদর্শিত হবে:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    old-folder/file.txt -> new-folder/file.txt

আমি গিট সংস্করণ 2.26.1 দিয়ে পরীক্ষা করেছি।

থেকে নিষ্কাশিত GitHub সহায়তা পৃষ্ঠা


-3

আমি ফাইলগুলি সরানো এবং তারপর করি

git add -A

যা সমস্ত মোছা / নতুন ফাইলগুলিকে স্যাটেজিংয়ের জায়গায় রেখে দেয়। এখানে গিট বুঝতে পারে যে ফাইলটি সরানো হয়েছে।

git commit -m "my message"
git push

আমি জানি না কেন তবে এটি আমার পক্ষে কাজ করে।


এখানে কৌশলটি হ'ল আপনাকে একটি অক্ষরও পরিবর্তন করতে হবে না, আপনি কিছু পরিবর্তন করে Ctrl + Z টিপলেও ইতিহাসটি নষ্ট হয়ে যাবে। সেক্ষেত্রে আপনি যদি কিছু লিখেন তবে ফাইলটি উল্টে দিন এবং এটিকে আবার সরিয়ে নিয়ে যান এবং এর জন্য একটি একক যোগ-> প্রতিশ্রুতিবদ্ধ করুন।
জেলিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.