গিট এমভি এবং কেবলমাত্র ডিরেক্টরি ক্ষেত্রে পরিবর্তন


259

যখন আমি অনুরূপ প্রশ্ন পেয়েছি তখন আমি আমার সমস্যার কোনও উত্তর পাইনি

আমি যখন ডিরেক্টরিটি FOO থেকে foo থেকে নাম পরিবর্তন করার চেষ্টা করি তখনই git mv FOO fooপাই

fatal: renaming 'FOO' failed: Invalid argument

ঠিক আছে. তাই আমি চেষ্টাgit mv FOO foo2 && git mv foo2 foo

কিন্তু যখন আমি মাধ্যমে প্রতিশ্রুতিবদ্ধ করার চেষ্টা git commit .করি

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

যখন আমি git add fooকোনও পরিবর্তন না করে ডিরেক্টরি যুক্ত করি এবং git commit .আমাকে আবার একই বার্তা দেয়।

আমি কি ভুল করছি? আমি ভেবেছিলাম আমি কেস-সংবেদনশীল সিস্টেম (ওএসএক্স) ব্যবহার করছি কেন আমি কেবল ডিরেক্টরিটির নাম পরিবর্তন করতে পারি না?


10
ওএস এক্স এর ফাইল সিস্টেমটি কেস-সংবেদনশীল নয়।
মিপাদি

2
@ মিপাদি এটি কেস-সংবেদনশীল মোডে পরিচালনা করতে পারে তবে এটি সাধারণত ডিফল্ট হিসাবে বন্ধ থাকে।
গর্ডনএম

1
এই প্রশ্ন এবং এর উত্তরগুলি উইন্ডোজেও কার্যকর। আনগ্যাগিং "অক্স" বিবেচনা করুন
বেরেট

1
স্ট্যাকওভারফ্লো. com/a/ 24979063 / 6309 দেখুন : গিট 2.0.0 থেকে, একটি সহজ git mvকাজ।
ভোনসি

git mv foo Fooআপনি যদি সাইগউইন শেল ব্যবহার করেন তবে উইন্ডোতে আপনি নিয়মিত ব্যবহার করতে পারেন ।
অ্যান্ড্রু স্কট

উত্তর:


409

আপনি একটি ক্ষেত্রে সংবেদনশীল পরিবেশে রয়েছেন। আরও, গিটটি যেমন বোঝে তেমন যোগ করার -Aফলে এর অপসারণের দিকটি যত্ন নেওয়া হবে না mvসতর্কবাণী! নিশ্চিত করুন যে আপনি যখন এটি করেন তখন অন্য কোনও পরিবর্তন বা চিহ্নবিহীন ফাইলগুলি তার কাছাকাছি নেই বা তারা এই পরিবর্তনের অংশ হিসাবে প্রতিশ্রুতিবদ্ধ হবে! git stash -uপ্রথমে এটি করুন এবং তারপরে করুন git stash pop। অবিরত: এটি পেতে, নিম্নলিখিতটি করুন:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

এটিই কার্যনির্বাহী ডিরেক্টরি পরিবর্তন করার, প্রতিশ্রুতিবদ্ধকরণ এবং তারপরে ২ টি কমিটকে ভেঙে ফেলার আঁকা উপায়। আপনি কেবল সূচীতে ফাইলটি সরিয়ে নিতে পারেন, তবে এমন ব্যক্তির কাছে যা গিটে নতুন, এটি কী ঘটছে তা যথেষ্ট পরিমাণে স্পষ্ট নাও হতে পারে। এর সংক্ষিপ্ত সংস্করণটি

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

একটি মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, git rebase -i HEAD~5সেখানে মামলাটি স্থির করতে এবং ইতিহাসে কোথাও ভুল মামলা উপস্থিত না হওয়ার জন্য আপনি একটি ইন্টারেক্টিভ রিবেসও করতে পারেন ( যদি ভুল মামলাটি 5 টি কমিট্টর আগে চালু করা হয়েছিল)। আপনার যদি সতর্কতা অবলম্বন করতে হয় যে আপনি যদি এই কাজটি করেন তখন থেকে কমিটের হ্যাশগুলি আলাদা হয়ে যায় এবং অন্যদের শাখাটির সাম্প্রতিক অতীতের সাথে তাদের কাজটি পুনরায় বা পুনরায় মার্জ করতে হবে।

এটি কোনও ফাইলের নাম সংশোধন করার সাথে সম্পর্কিত: গিটটি কি সংবেদনশীল নয়?


1
ধন্যবাদ। এটি আমাকে পাগল করে চলেছে। আমি -A বা --amend বিকল্প সম্পর্কে জানতাম না।
oschrenk

7
-এর সাথে সাবধানতাযুক্ত, যেহেতু এটি পুনরায় ক্রমহীন আপনার বর্তমান ডিরেক্টরিতে সমস্ত কন্টেন্ট যুক্ত করে রাখবে, আনট্র্যাকড স্টাফ সহ। ন্যায়সঙ্গত হতে পারে git add foo2
rich.e

2
ঐটা ঠিক. তবে আপনাকে foo2 অপসারণের পাশাপাশি পৃথক পৃথকভাবে FOO সংযোজন উভয়ই পর্যায়ে নিতে হবে। -Aউভয়ের যত্ন নেয় প্রথম পদক্ষেপের জন্য তদ্বিপরীত। আমি সতর্কতা যুক্ত করব। ধন্যবাদ!
অ্যাডাম ডিমিট্রুক

ইন্টারেক্টিভ রিবেস দিয়ে আপনি নিজের ইতিহাসও পরিষ্কার করতে পারেন git rebase -i HEAD~2। দ্রষ্টব্য: এটি সরল করতে আপনার প্রথম প্রতিশ্রুতিতে চূড়ান্ত বার্তাটি সেট করুন এবং দ্বিতীয়টি ঠিক করুন।
অ্যালেক্স বি

5
গিট এমভি foo foo2 দিয়ে আমার সাফল্য ছিল; গিট এমভি foo2 এফও; গিট কমিট
ক্রিস

146

আপনি core.ignorecaseঅপশনটিকে মিথ্যাতে সেট করতে চান , যা গিটকে এমন ফাইল সিস্টেমগুলির ক্ষেত্রে মনোযোগ দিতে হবে যা এটি স্থানীয়ভাবে সমর্থন করে না। আপনার রেপো সক্ষম করতে:

$ git config core.ignorecase false

তারপরে আপনি ফাইলটির সাথে নামটি পরিবর্তন করতে পারেন git mvএবং এটি প্রত্যাশার মতো কাজ করবে।


1
আমি মনে করি এর অন্য কোথাও এর অবাঞ্ছিত প্রভাব থাকতে পারে। কেস সংবেদনশীল সিস্টেমগুলি গিটকে ভাবতে দেবে যে এটি একই দির।
অ্যাডাম ডাইমিট্রুক

2
আমি আমার বিশ্বব্যাপী কনফিগ করার অপশন যোগ কিন্তু এটা না করেনি সাহায্যের
oschrenk

3
আমি এটি OSX এর সাথে ব্যবহার করে কিছু অদ্ভুত আচরণ দেখছি। এইচআরএম I modified a file that doesn't exist.. এইচআরএম error: The following untracked working tree files would be overwritten by checkout:কিন্তু ... এই ফাইলগুলির অস্তিত্ব নেই।
স্কাইলার সেভল্যান্ড

এটি ঠিক আমি যা খুঁজছিলাম ছিল। আমি CentOS 5.6 চালাচ্ছি এবং এটি কেস পরিবর্তনটি গ্রহণ করতে পারে নি।
crmpicco

5
এটি কাজ করে না! গিট ১.৮.৩-এ, গিট নাম পরিবর্তন করা ফাইলটিকে নতুন ফাইল হিসাবে গণ্য করবে, অপসারণের পরিবর্তে + যুক্ত করা হবে। এই ধরনের প্রতিশ্রুতিবদ্ধকরণের ফলে দুটি একই ফাইলের সাহায্যে সংগ্রহস্থলটি ছেড়ে যাবে, যেমন foo এবং FOO উভয়ই বিদ্যমান! তবে যখন চেকআউটটি কেবল একটি ফাইল উপস্থিত হয় (তবে একটি ক্ষেত্রে অন্য ক্ষেত্রে প্রভাব ফেলতে পারে)
জনি ওয়াং

68

অস্থায়ী ফাইল নাম ব্যবহার করে গিট ১.7..7 ব্যবহার করে আমি এটি সমাধান করতে সক্ষম হয়েছি:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

মজাদার. তখন থেকে জিআইটি কিছু উন্নত হতে পারে। আমি যখন আবার এই সমস্যায় পড়ে যাব তখন আমি আবার চেষ্টা করব।
oschrenk

এইভাবে এটি করা খুব সহজ
ওলরে

ম্যাকোসে আমার জন্য কাজ করেছেন।
মিঃ_পুইট

14

( git mv-মুক্ত বৈকল্পিক।)

গিট অন ম্যাক ওএস এক্স ১০.৯-এ এই সমস্যাটি নিয়ে এসেছি। আমি নিম্নলিখিত হিসাবে এটি সমাধান:

git rm -r --cached /path/to/directory

এটি গিটে মুছে ফেলার জন্য ডিরেক্টরিটি পর্যায়ক্রমে করে তবে আসলে কোনও শারীরিক ফাইল ( --cached) মুছে না । এটি ডিরেক্টরিকে এখন উপযুক্ত কেস সহ, তালিকাভুক্ত ফাইলগুলিতে প্রদর্শিত হবে।

সুতরাং আপনি এটি করতে পারেন:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

গিটটি তখন স্বীকৃতি দেবে যে আপনি ফাইলগুলির নাম পরিবর্তন করেছেন এবং যখন করবেন তখন আপনাকে git statusবেশ কয়েকটি renamed:লাইন দেখতে হবে । এগুলি পরীক্ষা করুন এবং নিশ্চিত করুন যে সেগুলি সঠিক দেখাচ্ছে এবং যদি তাই হয় তবে আপনি পরিবর্তনগুলি সাধারণত সম্পাদন করতে পারেন।


আমি দেখতে পেয়েছি যে mvকমান্ডটি প্রকৃতপক্ষে ডিরেক্টরিটির নামকরণ করতে কাজ করে না; আমাকে এটি ফাইন্ডারের মধ্যে নামকরণ করতে হয়েছিল। এটি বাদে এই ফিক্সটি পুরোপুরি কার্যকর হয়।
অ্যাডাম এস

9

এটি একটি দ্রুত এবং বাগ-নিরাপদ সমাধান:

git mv -f path/to/foo/* path/to/FOO/

সতর্কবাণী! পুনরায় নামকরণ ফোল্ডারে সমস্ত ফাইলের নাম পরিবর্তন করুন (ব্যবহার করুন /*)।

একক ফাইলের নাম পরিবর্তন করবেন না। একটি বাগ এই বিশালাকার, এই বর্ণিত উত্তর

আপনি যদি প্রথমে ফলাফলটি দেখতে চান তবে ব্যবহার করুন -n:

git mv -f -n path/to/foo/* path/to/FOO/

আপনি এটি তৈরির পরে mv:

  1. পরিবর্তন প্রতিশ্রুতিবদ্ধ
  2. অন্য কোনও সংশোধনীতে চেকআউট করুন
  3. চেকআউট ফিরে।

এখন গিটের অভ্যন্তরীণ ফাইলগুলিতে এবং ফাইল সিস্টেমে BOTH ফোল্ডারটির নামকরণ করা উচিত।


আমি কি উপরের প্রশ্ন মন্তব্যে উল্লিখিত হিসাবে এটি কি কেবল গিট ২.০.১ এর জন্য? (উল্লেখ stackoverflow.com/a/24979063/6309 )
VonC

8

এটি -f বিকল্পের সাহায্যে জোর করুন:

git mv -f FOO foo

আমার জন্য কাজ না। আমার সেটিংটি .git / কনফিগারেশনের "উপেক্ষা = সত্য"। পুনরায় নামটি এভাবে মঞ্চে মঞ্চস্থ করা যায় না। (গিট সংস্করণ 1.8.3.msysgit.0) অ্যাডাম ডাইমিত্রুকের সমাধানটি হ'ল একমাত্র সঠিক উত্তর।
জনি ওয়াং

@ জোহনিওয়ং আপনার সেটিংটি এতে পরিবর্তন করুন false, এটি আমার পক্ষে কাজ করেছে
ইন্দার কুমার রাঠোর

এটির পরে যদি অন্য কম্পিউটারের ব্যবহারকারীরা তাদের কম্পিউটার কেস উপেক্ষা করে সেট করা থাকে তবে তারা কী টানলে অন্য সমস্ত কম্পিউটারে আপডেট হবে?
ব্রাইস

@ ব্রাইস নো, অন্যান্য ব্যবহারকারীরা পরিবর্তনগুলি টানতে পারার আগে আপনাকে পরিবর্তনগুলি সংঘটিত করতে হবে এবং কেন্দ্রীয় রেপোতে চাপ দিতে হবে।
কনইয়াক

3

আমার একটি সম্পর্কিত সমস্যা ছিল।

একটি ফোল্ডার নাম 'প্রো' (প্রথম তৈরি) এবং অন্য 'প্রো' (ভুল দ্বারা নির্মিত)। ম্যাকের ক্ষেত্রে এটি একই জিনিস তবে গিট অনুসারে আলাদা।

$ git config core.ignorecase false

গিট কনফিগারেশন ফাইলগুলি ডান ফোল্ডারে নাম পরিবর্তন করে (ধন্যবাদ), এবং 'প্রো' (নো !!) - তে ভূত ফাইলগুলি তৈরি করেছে। আমি ট্র্যাকে ভুতের ফাইলের পরিবর্তনগুলি যুক্ত করতে পারিনি এবং those ফাইলগুলি আমার সাথে না নিলে আমি অন্যান্য শাখাগুলি চেকআউট করতে পারি না এবং আমি এটিকে কোনওভাবে পুনরায় সেট করতেও পারি না।

পরিবর্তে, আমি না

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

এটিকে অতিরিক্ত সুরক্ষিত করার জন্য, আমি এটি একটি পৃথক ফিক্স শাখায় করেছি এবং তারপরে আমি আবার মূল শাখায় একীভূত হয়েছি

ভূত ফাইল ইস্যু দ্বারা নির্মিত, কোনও গুরু কীভাবে এবং কেন ব্যাখ্যা করতে পারেন? আগাম ধন্যবাদ.


2

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


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

1

এই পৃষ্ঠার সমস্ত গিটফুর চারপাশে একটি খুব সহজ সমাধান এখানে।

  1. আপনার প্রকল্পের ফাইলগুলি ম্যানুয়ালি অনুলিপি করুন।
  2. সমস্ত ফাইল rm।
  3. গিট স্বাভাবিকের মতো কমিট
  4. নিজেই ফাইলগুলি যুক্ত করুন back
  5. সমস্ত ফাইল যুক্ত করুন।
  6. গিট স্বাভাবিকের মতো কমিট
  7. মুনাফা।

1
এটি স্থানীয়ভাবে কাজ করে তবে অন্য কেউ যদি টান দেয় তবে এটি তাদের কেস পরিবর্তন করবে না।
জেসন

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

0

"গিট এমভি" ব্যবহার করে অ্যাডাম ডাইমিট্রিকের উত্তরটির উন্নতি করুন (নির্বোধ যে এসও আমাকে তার উত্তর সম্পর্কে মন্তব্য করতে দেয় না), স্বয়ংক্রিয়ভাবে সরানো ফাইলগুলি স্টেজ করবে। কোনও স্ট্যাশিংয়ের দরকার নেই এবং ঝুঁকিপূর্ণ "গিট অ্যাড-এ" এড়ানো যায়:

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";

0

এটি আমার পক্ষে উইন্ডোজে দুর্দান্ত কাজ করেছে। নিম্নলিখিতগুলির সাথে পাওয়ারশেল ব্যবহৃত হয়েছে:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (ঐচ্ছিক) git push

উপরের আদমের উত্তরের জন্য ধন্যবাদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.