গিট-এমভি এর উদ্দেশ্য কী?


287

আমি যা বুঝতে পারি তা থেকে, গিটকে ফাইলের নাম / চালনা / অনুলিপি অপারেশনগুলি ট্র্যাক করার দরকার নেই , তাই গিট এমভি এর আসল উদ্দেশ্য কী? ম্যান পেজটি বিশেষ বর্ণনামূলক নয় ...

এটি কি অচল? এটি কি কোনও অভ্যন্তরীণ কমান্ড, নিয়মিত ব্যবহারকারীদের দ্বারা ব্যবহার করার উদ্দেশ্যে নয়?

উত্তর:


390
git mv oldname newname

এর জন্য কেবল সংক্ষিপ্ত

mv oldname newname
git add newname
git rm oldname

যেমন এটি স্বয়ংক্রিয়ভাবে পুরানো এবং নতুন উভয় পাথের জন্য সূচক আপডেট করে।


38
এছাড়াও এতে অন্তর্নির্মিত কয়েকটি সুরক্ষা ব্যবস্থা রয়েছে
জাকুব নরবস্কি

6
ধন্যবাদ @ চারেলসবেইলি - এর পরে কি গিট ফাইলগুলি নতুননামফাইলে এবং ওল্ডনেমফাইলে আলাদা বলে বিবেচিত হবে? যদি হ্যাঁ, আমরা যদি তাদের মার্জ করতে চাই তবে কী হবে? বলুন আমরা একটি শাখা এ-তে একটি পিঁপড়া প্রকল্পটি শাখা করি এবং শাখা বি তৈরি করি তারপরে বি-তে প্রকল্পগুলি মেকানাইজ করব ফাইলের নামগুলি একই তবে প্রকল্পের কাঠামো পরিবর্তিত হওয়ার সাথে সাথে বিভিন্ন পথে চালিত। বলুন উভয় শাখা সমান্তরালে কিছু সময়ের জন্য বৃদ্ধি পেয়েছিল। এক পর্যায়ে যদি আমরা প্রকল্পগুলি মার্জ করতে চাই তবে কীভাবে জানবে যে এটি একই ফাইলটির নামকরণ হয়েছে এটিই? (যদি "গিট এমভি" == "গিট অ্যাড + গিট আরএম")
গোলাপ

2
@ সের্গেআরশানস্কি যদি অটো সনাক্তকরণের জন্য ভুল হয়ে যায় তবে mv oldname newname; git add newname; git rm oldnameএটির জন্যও ভুল হবে git mv oldname newname( এই উত্তরটি দেখুন )।
আজেদী 32

5
নোটটি এটির git mvথেকে কিছুটা আলাদা , এটির mv oldname newname; git add newname; git rm oldnameআগে আপনি যদি ফাইলটিতে git mvপরিবর্তন করেন git addতবে নতুন ফাইল হওয়া পর্যন্ত এই পরিবর্তনগুলি মঞ্চস্থ করা হবে না ।
আজেদী 32

2
গিট এমভি কিছু আলাদা করছে, কারণ এটি ফাইল নাম ক্ষেত্রে (foo.txt to Foo.txt) পরিবর্তনগুলি পরিচালনা করে যখন এই কমান্ডগুলি পৃথকভাবে চালিত হয় না (
ওএসএক্সে

66

থেকে সরকারী GitFaq :

গিটের একটি নতুন নাম কমান্ড রয়েছে git mvতবে এটি কেবল একটি সুবিধা। ফাইলটি মুছে ফেলা এবং ভিন্ন নাম এবং একই সামগ্রীর সাথে আরেকটি যুক্ত করা থেকে প্রভাবটি পৃথক


8
সুতরাং আপনি ফাইল ইতিহাস আলগা? আমার ধারণা ছিল যে নাম বদলানো সেই ডিরেক্টরিটির পুরানো ইতিহাস
রাখবে

17
ভাল, হ্যাঁ এবং না। নতুন নামগুলির বিষয়ে উপরের অফিসিয়াল গিটফ্যাক লিঙ্কটি পড়ুন এবং তারপরে লিনাস টরভাল্ডস লম্বা ই-মেইলটি পড়ুন কেন তিনি এসসিএম সরঞ্জাম ট্র্যাকিং ফাইলগুলির ধারণা পছন্দ করেন না: permalink.gmane.org/gmane.comp.version-control.git/ 217
অ্যাডাম নফসিংগার

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

7
@ অ্যাডমনফসিংগার যে লিঙ্কটি মারা গেছে। এখানে একটি আয়না রয়েছে: web.archive.org/web/20150209075907/http://…
কার্ল ওয়ালশ

2
কোনও সরকারী রেফারেন্স (যেমন আরও বেশি প্রশ্নযোগ্য যে একটি এফএকিউ) এর মধ্যে git mvম্যানুয়াল পদ্ধতির মধ্যে সামঞ্জস্যতা রয়েছে ? এটি থেকে স্পষ্ট নয় git help mv
tvo

40

গিট আপনার জন্য অনুমান করার চেষ্টা করছে আপনি যা করতে চেষ্টা করছেন। অবিচ্ছিন্ন ইতিহাস সংরক্ষণের জন্য এটি সর্বাত্মক প্রচেষ্টা চালিয়ে যাচ্ছে। অবশ্যই, এটি নিখুঁত নয়। সুতরাং git mvআপনাকে আপনার উদ্দেশ্য নিয়ে স্পষ্ট হতে এবং কিছু ত্রুটি এড়াতে সহায়তা করে।

এই উদাহরণ বিবেচনা করুন। একটি খালি রেপো দিয়ে শুরু করা,

git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
mv a c
mv b a
git status

ফলাফল:

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   a
#   deleted:    b
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   c
no changes added to commit (use "git add" and/or "git commit -a")

স্বয়ংক্রিয়ায়ন ব্যর্থ হয়েছে :( নাকি এটি হয়েছে?

$ git add *
$ git commit -m "change"
$ git log c

commit 0c5425be1121c20cc45df04734398dfbac689c39
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:24:56 2013 -0400

    change

এবং তারপর

$ git log --follow c

Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:24:56 2013 -0400

    change

commit 50c2a4604a27be2a1f4b95399d5e0f96c3dbf70a
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:24:45 2013 -0400

    initial commit

এবার পরিবর্তে চেষ্টা করুন ( .gitপরীক্ষার সময় ফোল্ডারটি মুছতে ভুলবেন না ):

git init
echo "First" >a
echo "Second" >b
git add *
git commit -m "initial commit"
git mv a c
git status

এ পর্যন্ত সব ঠিকই:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    a -> c


git mv b a
git status

এখন, কেউ নিখুঁত:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   a
#   deleted:    b
#   new file:   c
#

সত্যি? কিন্তু অবশ্যই...

git add *
git commit -m "change"
git log c
git log --follow c

... এবং ফলাফল উপরের মতই: কেবলমাত্র --followসম্পূর্ণ ইতিহাস দেখায়।


এখন, নামকরণের সাথে সাবধানতা অবলম্বন করুন, যেহেতু উভয় বিকল্পই আজব প্রভাব ফেলতে পারে । উদাহরণ:

git init
echo "First" >a
git add a
git commit -m "initial a"
echo "Second" >b
git add b
git commit -m "initial b"

git mv a c
git commit -m "first move"
git mv b a
git commit -m "second move"

git log --follow a

commit 81b80f5690deec1864ebff294f875980216a059d
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:35:58 2013 -0400

    second move

commit f284fba9dc8455295b1abdaae9cc6ee941b66e7f
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:34:54 2013 -0400

    initial b

এর সাথে বৈসাদৃশ্য করুন:

git init
echo "First" >a
git add a
git commit -m "initial a"
echo "Second" >b
git add b
git commit -m "initial b"

git mv a c
git mv b a
git commit -m "both moves at the same time"

git log --follow a

ফলাফল:

commit 84bf29b01f32ea6b746857e0d8401654c4413ecd
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:37:13 2013 -0400

    both moves at the same time

commit ec0de3c5358758ffda462913f6e6294731400455
Author: Sergey Orshanskiy <*****@gmail.com>
Date:   Sat Oct 12 00:36:52 2013 -0400

    initial a

ওপস ... এখন ইতিহাস প্রাথমিক খ এর পরিবর্তে প্রাথমিকের দিকে ফিরে যাচ্ছে , যা ভুল। সুতরাং আমরা যখন একবারে দুটি চালনা করি তখন গিট বিভ্রান্ত হয়ে পড়ে এবং পরিবর্তনগুলি সঠিকভাবে ট্র্যাক করে না। যাইহোক, আমার পরীক্ষায় একই ঘটনা ঘটেছিল যখন আমি ফাইলগুলি ব্যবহারের পরিবর্তে মুছে / তৈরি করেছি । যত্ন সহকারে এগিয়ে যান; আপনাকে সতর্ক করা হয়েছে ...git mv


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

1
ঠিক আছে, আমার উদাহরণগুলি হতাশাব্যঞ্জক। ফাইলগুলি খালি থাকাকালীন পরিবর্তনের যথাযথভাবে ব্যাখ্যা করা আরও অনেক কঠিন। আমি কল্পনা করি যে আপনি যদি প্রতিটি নাম পরিবর্তন করে কেবল প্রতিশ্রুতিবদ্ধ হন তবে আপনার ভাল হওয়া উচিত।
osa

27

@ চার্লস যেমন বলেছেন, git mvএকটি শর্টহ্যান্ড।

এখানে আসল প্রশ্নটি হ'ল "অন্যান্য সংস্করণ নিয়ন্ত্রণ ব্যবস্থা (যেমন সাবভারশন এবং পারফোর্স) ফাইলের নামগুলি বিশেষভাবে চিকিত্সা করে G কেন গিট দেয় না?"

লিনাস http://permalink.gmane.org/gmane.comp.version-control.git/217 এ বৈশিষ্ট্যযুক্ত কৌশল সহ ব্যাখ্যা করেছেন :

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


9

git mvউপরে উল্লেখ না করার জন্য আমার আরও একটি ব্যবহার রয়েছে's

আবিষ্কার করার পরে git add -p(গিট অ্যাডের প্যাচ মোড; দেখুন http://git-scm.com/docs/git-add ), আমি সূচিগুলিতে যুক্ত করার সাথে সাথে পরিবর্তনগুলি পর্যালোচনা করতে এটি ব্যবহার করতে চাই। সুতরাং আমার ওয়ার্কফ্লো কোডে (1) কাজ হয়ে যায়, (2) পর্যালোচনা করুন এবং সূচীতে যুক্ত করুন, (3) প্রতিশ্রুতিবদ্ধ।

কিভাবে git mvফিট? যদি সরাসরি কোনও ফাইল সরানো হয় git rmএবং তারপরে এবং git addসমস্ত পরিবর্তনগুলি সূচকে যুক্ত হয় এবং পরিবর্তনগুলি দেখতে গিট ডিফ ব্যবহার করা কম সহজ (প্রতিশ্রুতি দেওয়ার আগে)। git mvযাইহোক, ব্যবহার করে সূচকে নতুন পথ জুড়েছে কিন্তু ফাইলটিতে কোনও পরিবর্তন করা হয়নি, সুতরাং এটি যথারীতি কাজ করার অনুমতি দেয় git diffএবং git add -pকাজ করে।


5

একটি কুলুঙ্গি ক্ষেত্রে রয়েছে যেখানে git mvখুব কার্যকর থাকে: আপনি যখন কেস-সংবেদনশীল ফাইল সিস্টেমে কোনও ফাইলের নামের আবরণ পরিবর্তন করতে চান। এপিএফএস (ম্যাক) এবং এনটিএফএস (উইন্ডোজ) উভয়ই ডিফল্টরূপে কেস-সংবেদনশীল (তবে কেস-সংরক্ষণ)।

সিবি বেইলির উত্তরের একটি মন্তব্যে গ্রেগ.কিন্ডেল এটির উল্লেখ করেছেন।

মনে করুন আপনি একটি ম্যাকের সাথে কাজ করছেন এবং Mytest.txtগিট দ্বারা পরিচালিত একটি ফাইল রয়েছে । আপনি ফাইলের নামটি পরিবর্তন করতে চান MyTest.txt

আপনি চেষ্টা করতে পারেন:

$ mv Mytest.txt MyTest.txt
overwrite MyTest.txt? (y/n [n]) y
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

ওহে প্রিয়। গিট ফাইলটিতে কোনও পরিবর্তন হয়েছে তা স্বীকার করে না।

আপনি পারে ফাইল সম্পূর্ণরূপে পুনঃনামকরনের তারপর এটি ফিরে পুনঃনামকরনের দ্বারা এই সমস্যা এড়ানোর:

$ mv Mytest.txt temp.txt
$ git rm Mytest.txt
rm 'Mytest.txt'
$ mv temp.txt MyTest.txt
$ git add MyTest.txt 
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    Mytest.txt -> MyTest.txt

Hurray থেকে!

অথবা আপনি নিজেকে ব্যবহার করে এমন সমস্ত ঝামেলা বাঁচাতে পারেন git mv:

$ git mv Mytest.txt MyTest.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

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