অন্যটির ভিতরে একটি ফোল্ডার সরাতে git কমান্ড


193

আমি commonগুচ্ছ উত্স ফাইল এবং ফোল্ডার সহ একটি ফোল্ডার তৈরি করেছি।

এখন আমি commonফোল্ডারটিকে ফোল্ডারে সরাতে includeচাই যাতে দেখতে এটির মতো লাগেinclude/common

আমি এগুলি চেষ্টা করেছিলাম:

  1. git add include

  2. git mv common/ include/

    তবে এটি এই ত্রুটির সাথে ব্যর্থ হয়

    মারাত্মক: খারাপ উত্স, উত্স = মাইরেপো / সাধারণ, গন্তব্য = মাইরেপো / অন্তর্ভুক্ত

  3. আমি চেষ্টা করেছি git mv common/ include/commonকিন্তু আমি একই ত্রুটি পেয়েছি

কোন ধারণা কিভাবে এটি অর্জন?

উত্তর:


177

গিট সম্পর্কে সর্বোত্তম জিনিসগুলির মধ্যে একটি হ'ল আপনার পরিষ্কারভাবে ফাইলের নাম পরিবর্তন করতে হবে না। গিট ফাইলগুলির বিষয়বস্তুর তুলনা করে এটি নির্ধারণ করবে।

সুতরাং, আপনার ক্ষেত্রে, এত বেশি পরিশ্রম করবেন না:

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

দৌড়তে git statusআপনাকে এরকম কিছু দেখাতে হবে:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#

43
এটি আমার পক্ষে কাজ করে না (উইন্ডোজ 7, ​​1.7.6.msysgit.0 ব্যবহার করে)। গিট মনে করে যে পুরানো ফাইলগুলি মুছে ফেলা হয়েছিল এবং নতুন ফাইল যুক্ত করা হয়েছিল।
বার্ট

হুঁ, সম্ভবত উইন্ডোজে কাজ করা যায় না ফাইলের অনুরূপতা নির্ধারণের জন্য গিট কিছু বাহ্যিক ইউটিলিটি ব্যবহার করে? এটি গিটের বাস্তবায়নের মূল অংশ ছিল।
Andres Jaan ট্যাক

13
@OliverF। সংশোধন: git mvসমতুল্য।
আন্দ্রেস জান ট্যাক

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

2
যদি গিট লাইনের শেষ রূপান্তর করে, তবে এটি @ বার্ট দ্বারা বর্ণিত সমস্যার ফলস্বরূপ। এটি কাজ করার জন্য আপনাকে নিম্নলিখিতটি করতে হবে: গিট কনফিগারেশন
মারিয়ানো ডুপন্ট

163
 git mv common include

কাজ করা উচিত.

থেকে git mvman পৃষ্ঠা :

git mv [-f] [-n] [-k] <source> ... <destination directory>

দ্বিতীয় আকারে, সর্বশেষ যুক্তিটি একটি বিদ্যমান ডিরেক্টরি হতে হবে; প্রদত্ত উত্সগুলি এই ডিরেক্টরিতে সরানো হবে
সফল সমাপ্তির পরে সূচকটি আপডেট হয়েছে তবে পরিবর্তনটি এখনও প্রতিশ্রুতিবদ্ধ।

সরানোর আগে কোনও " git add" করা উচিত নয় ।


দ্রষ্টব্য: " git mv A B/", যখন Bডিরেক্টরি হিসাবে উপস্থিত থাকে না, ত্রুটিযুক্ত হওয়া উচিত, তবে তা হয়নি।

গিট 1.9 / 2.0 (Q1 2014) এর জন্য ম্যাথিউ ময় ( moy) দ্বারা প্রতিশ্রুতিবদ্ধ c57f628 দেখুন :

গিট ট্রেলিং স্ল্যাশটি ছাঁটাই করত এবং কমান্ডটিকে ' git mv file no-such-dir' এর সমতুল্য করত , যা ফাইলটি তৈরি করেছিল no-such-dir(যখন ট্রেইলিং স্ল্যাশ স্পষ্টভাবে বলেছিল যে এটি কেবল ডিরেক্টরি হতে পারে)।

এই প্যাচ গন্তব্য পথের পিছনে স্ল্যাশ অপসারণ এড়িয়ে যায়।
এর পিছনের স্ল্যাশ সহ পাথটি পুনরায় নামকরণ (2) এ পাস করা হয়েছে, যা যথাযথ বার্তায় ত্রুটিযুক্ত:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory

2
নিখুঁতভাবে কাজ করেছেন - এবং git mvদেখতে আরও ভাল পদ্ধতির মতো দেখায়!
টমাস পেট্রিসেক

23

COMMAND:

$ git mv oldFolderName newFolderName

এটি সাধারণত সূক্ষ্ম কাজ করে।

ত্রুটি "খারাপ উত্স ..." সাধারণত ইঙ্গিত দেয় যে শেষ প্রতিশ্রুতির পরে উত্স ডিরেক্টরিতে কিছু নতুন নাম ছিল এবং সুতরাং git mvপ্রত্যাশিত ফাইলটি খুঁজে পাওয়া যায় না।

সমাধানটি সহজ - আবেদনের আগে কমিট করুন git mv


15

দৌড়ানোর আগে আপনি স্টেজিং এরিয়ায় আপনার সমস্ত পরিবর্তন যুক্ত করেছেন তা নিশ্চিত করুন

git mv oldFolderName newFoldername

গিট ত্রুটির সাথে ব্যর্থ হয়

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

যদি কোনও আনড্রেড ফাইল থাকে তবে আমি সন্ধান করেছি।


"যদি কোনও আনডেড ফাইল না থাকে তবে আমি সবেমাত্র খুঁজে পেয়েছি" " - ধন্যবাদ!
কাকোডার

3

ডিরেক্টরিতে সমস্ত ফাইলকে একটি উপ ডিরেক্টরিতে স্থানান্তরিত করার আরেকটি উপায় (গিট ইতিহাস রাখে):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;


3

git mvযেখানে আমি একটি ফোল্ডারের সামগ্রীগুলি একটি বিদ্যমান ফোল্ডারে স্থানান্তরিত করতে চেয়েছিলাম সেখানে আমার একই সমস্যা ছিল এবং এই "সাধারণ" স্ক্রিপ্টটি দিয়ে শেষ হয়েছিল:

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

ব্যাখ্যা

  • git ls-files: commonগিটে চেক করা সমস্ত ফাইল ( ফোল্ডারে) সন্ধান করুন
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: ফোল্ডারের ভিতরে includeএকই ডিরেক্টরি কাঠামো সহ একটি নতুন ফোল্ডার তৈরি করুনcommon
  • git mv $f $newdir/$(basename "$f"): সদ্য নির্মিত ফোল্ডারে ফাইলটি সরান

এটি করার কারণটি হ'ল গিটকে বিদ্যমান ফোল্ডারগুলিতে ফাইলগুলি সরানোতে সমস্যা হচ্ছে বলে মনে হয় এবং আপনি যদি কোনও ফাইলকে অ-বিদ্যমান ফোল্ডারে স্থানান্তরিত করার চেষ্টা করেন তবে এটি ব্যর্থ হবে (অতএব mkdir -p)।

এই পদ্ধতির সুন্দর জিনিসটি হ'ল এটি কেবলমাত্র সেই ফাইলগুলিকে স্পর্শ করে যা ইতিমধ্যে গিটতে চেক ইন করা হয়েছিল। কেবলমাত্র git mvএকটি সম্পূর্ণ ফোল্ডার সরাতে ব্যবহার করে এবং ফোল্ডারে আনস্টেজড পরিবর্তনগুলি রয়েছে, গিট কী করবে তা জানতে পারবে না।

ফাইলগুলি সরিয়ে নেওয়ার পরে আপনি বাকী থাকা অপরিশোধিত পরিবর্তনগুলি সরাতে রিপোজিটরিটি পরিষ্কার করতে চাইতে পারেন - প্রথমে শুকনো রান চালানোর কথা মনে রাখবেন!

git clean -fd -n

2

আমি দুঃখিত "" আন্দ্রে জান ট্যাক "এর" উত্তর "মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই।

আমি মনে করি আমার মেসেজ মুছে ফেলা হবে ((তবে আমি কেবল "লুসার" এবং অন্যদের যারা সতর্কতা পেয়েছি তাদের সতর্ক করতে চাই: সতর্ক থাকুন

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

এটির কারণে আপনি নতুন ফোল্ডারে আপনার প্রকল্পের গিট ইতিহাস দেখতে পাবেন না।

আমি চেষ্টা করেছিলাম

$ git mv oldFolderName newFolderName

পেয়েছেন

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

আমি করেছিলাম

git rm -r oldFolderName

এবং

git add newFolderName

এবং আমি আমার প্রকল্পে পুরানো গিট ইতিহাস দেখতে পাচ্ছি না। কমপক্ষে আমার প্রকল্পটি ক্ষতিগ্রস্ত হয়নি। এখন আমার নতুন ফোল্ডারনামে আমার প্রকল্প রয়েছে তবে ইতিহাস ছাড়া (

কেবল সতর্ক করতে চাই, "অ্যান্ড্রেস জান ট্যাক" এর পরামর্শ ব্যবহার করে সতর্ক থাকুন, যদি আপনি নিজের গিটের অসামান্যতা হারাতে না চান।


আপনার সমস্ত পরিবর্তন যুক্ত করা হয়েছে তা নিশ্চিত করুন। গ্যাড "খারাপ উত্স" বলতে ব্যর্থ হয়েছে যদি অযৌক্তিক পরিবর্তন হয় তবে আমি সন্ধান করেছি।
কেভিন প্লাক

0

আমার অনুরূপ সমস্যা ছিল, তবে আমি যে ফোল্ডারে সরিয়ে নিতে চেয়েছিলাম সেগুলিতে আমার কাছে ফাইল ছিল যা আমি ট্র্যাক করছি না।

ধরা যাক আমার কাছে ফাইল ছিল

a/file1
a/untracked1
b/file2
b/untracked2

এবং আমি কেবল ট্র্যাক করা ফাইলগুলি সাবফোল্ডারে স্থানান্তরিত করতে চেয়েছিলাম subdir, সুতরাং লক্ষ্যটি ছিল:

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

আমি যা করেছি তা হ'ল:

  • আমি নতুন ফোল্ডার তৈরি করেছি এবং সরানোতে আগ্রহী সমস্ত ফাইল সরিয়ে নিয়েছি: mkdir tmpdir && mv a b tmpdir
  • পুরানো ফাইল চেক আউট git checkout a b
  • নতুন দির তৈরি করেছে এবং পরিষ্কার ফোল্ডারগুলি (চিহ্নবিহীন ফাইল ছাড়াই) নতুন সাবডিরে সরানো হয়েছে: mkdir subdir && mv a b subdir
  • সাবডির থেকে সমস্ত ফাইল যুক্ত করা হয়েছে (যাতে গিট কেবল পূর্ববর্তী ফাইলগুলি যুক্ত করতে পারে - এটি git add --updateডিরেক্টরি পরিবর্তনের কৌশল সহকারে অন্তর্ভুক্ত ছিল ): git add subdir(সাধারণত এটি এমনকি অপ্রকাশিত ফাইলও যুক্ত করতে পারে - এটির জন্য ফাইল তৈরির প্রয়োজন .gitignoreহবে)
  • git status এখন কেবল সরানো ফাইলগুলি দেখায়
  • tmpdir থেকে সাবডিরের বাকী ফাইলগুলি সরানো হয়েছে: mv tmpdir/* subdir
  • git statusদেখে মনে হচ্ছে আমরা মৃত্যুদণ্ড কার্যকর করেছি git mv:)

-1

আমি এটি করে উইন্ডোতে এটি সমাধান করেছি:

  • ওপেন পাওয়ার শেল কনসোল
  • দির চালান
  • ফাইল / ফোল্ডারের নাম কলামের উপরে আল্ট-ক্লিক করুন এবং টেনে আনুন, তারপরে অনুলিপি করুন
  • নোটপ্যাড ++ এ আটকান
  • রিজেক্সের সাথে প্রতিস্থাপন চালান: (.*)সাথে প্রতিস্থাপন করুনgit mv ".\\\1" ".\\<New_Folder_Here>\"
  • নোটপ্যাড ++ থেকে সমস্ত পাঠ্যকে পাওয়ারশেলে অনুলিপি করুন
  • প্রবেশ করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.