গিটে ফাইলের নামগুলি হ্যান্ডলিং করা


440

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

যাইহোক, এই আজকের রাতেই আমি আবার ফিরে এসেছি git mv

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   index.html
#

থেকে ফাইন্ডারে আমার স্টাইলশীট পুনঃনামকরণ iphone.cssকরাmobile.css

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   index.html
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    css/iphone.css
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   css/mobile.css

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

> $ git reset HEAD .
Unstaged changes after reset:
M   css/iphone.css
M   index.html

আমি যেখানে শুরু করেছি সেখানে ফিরে এসেছি।

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   index.html
#

git mvপরিবর্তে ব্যবহার করতে দেয় ।

> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    css/iphone.css -> css/mobile.css
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   index.html
#

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


29
গিট ফাইলগুলি নয়, সামগ্রীগুলি ট্র্যাক করে, সুতরাং আপনি কীভাবে আপনার সূচককে যথাযথ অবস্থায় পাবেন - add+rmবা mv- এটি একই ফল উত্পন্ন করে। গিট এর পরে এটির পুনর্নবীকরণ / অনুলিপি সনাক্তকরণ ব্যবহার করে আপনাকে জানায় যে এটি একটি পুনর্নবীকরণ। আপনার উদ্ধৃত উত্সটিও সঠিক নয় c আপনি একই প্রতিশ্রুতিতে + নাম পরিবর্তন করেছেন কিনা তা আসলেই কিছু যায় আসে না। আপনি যখন পরিবর্তন এবং পুনঃনামকরণ উভয় ক্ষেত্রে পৃথক করেন, পুনরায় নামকরণ সনাক্তকরণ এটি পুনরায় নামকরণ + পরিবর্তন হিসাবে দেখবে, বা যদি পরিবর্তনটি একটি সম্পূর্ণ পুনর্লিখন হয় তবে এটি যুক্ত এবং মুছে ফেলা হিসাবে প্রদর্শিত হবে - আপনি কীভাবে সম্পাদন করেছেন তা এখনও বিবেচ্য নয় এটা।
ক্যাসাবেল

6
যদি এটি সত্য হয় তবে কেন এটি অনুসন্ধানক ব্যবহার করে আমার নাম পরিবর্তন করে এটি সনাক্ত করল না?
গ্রেগ কে

26
git mv old newস্বয়ংক্রিয়ভাবে সূচক আপডেট করে। আপনি যখন গীত বাইরে নামান্তর, আপনি করতে হবে git add newএবং git rm oldসূচক পরিবর্তন মঞ্চ। একবার আপনি এটি করার পরে আপনার git statusপ্রত্যাশা মতো কাজ করবে।
ক্রিস জনসন

4
আমি সবেমাত্র একটি গুচ্ছ ফাইলগুলিকে একটি public_htmlডিয়ারের মধ্যে স্থানান্তরিত করেছি , যেগুলি গিটে ট্র্যাক করা হয়। সম্পাদন করে git add .এবং git commitএটি এখনও 'মুছে ফেলা' ফাইলগুলির একগুচ্ছ দেখায় git status। আমি একটি সম্পাদন করেছি git commit -aএবং মোছাগুলি কমিয়ে দেওয়া হয়েছিল তবে এখন যে ফাইলগুলিতে বাস করা আছে তার কোনও ইতিহাস নেই public_html। এই কাজের প্রবাহ আমার পছন্দ মতো মসৃণ নয়।
গ্রেগ কে

উত্তর:


352

জন্য ম্যানুয়েল পৃষ্ঠা বলেছেনgit mv

সফল সমাপ্তির পরে সূচকটি আপডেট করা হয়েছে, […]

সুতরাং, প্রথমে আপনাকে নিজের সূচকটি আপডেট করতে হবে (ব্যবহার করে git add mobile.css)। তবে
git status এখনও দুটি ভিন্ন ফাইল প্রদর্শন করবে

$ git status
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       new file:   mobile.css
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    iphone.css
#

আপনি দৌড়ের মাধ্যমে একটি আলাদা আউটপুট পেতে পারেন git commit --dry-run -a, যার ফলস্বরূপ আপনি যা প্রত্যাশা করেছেন:

Tanascius@H181 /d/temp/blo (master)
$ git commit --dry-run -a
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       renamed:    iphone.css -> mobile.css
#

আমি তোমাদের ঠিক কেন আমরা মধ্যে এই পার্থক্য দেখতে বলতে পারে না git statusএবং
git commit --dry-run -a, কিন্তু এখান থেকে একটি ইঙ্গিত আছে লিনাস :

Git সত্যিই এমনকি না যত্ন পুরো "এ পুনরায় নামকরণ সনাক্তকরণ" সম্পর্কে অভ্যন্তরীণভাবে, এবং যে কোনো করে আপনি renames সময় করেছি হিউরিস্টিক আমরা তারপর ব্যবহার সম্পূর্ণভাবে স্বাধীন দেন renames।

dry-runপ্রকৃত নামকরণের প্রক্রিয়া ব্যবহার করে, যখন git statusসম্ভবত এটি করে না।


1
আপনি যে পদক্ষেপটি করেছিলেন সেখানে উল্লেখ করতে ব্যর্থ হয়েছিলেন git add mobile.css। এটি git status -aনা থাকলে কেবল পূর্ববর্তী ট্র্যাক করা iphone.cssফাইলটি অপসারণ করতে 'দেখেছি' তবে এটি নতুন, তালাবিহীন mobile.cssফাইলটিকে স্পর্শ করতে পারত না । এছাড়াও, git status -aগিট 1.7.0 এবং তার পরে অবৈধ। "" গিট স্ট্যাটাস "" গিট কমিট - ড্রি রান "আর নয়” " মধ্যে kernel.org/pub/software/scm/git/docs/RelNotes-1.7.0.txtgit commit --dry-run -aআপনি যদি এই কার্যকারিতা চান তবে ব্যবহার করুন । অন্যরা যেমন বলেছে, কেবল সূচকটি আপডেট করুন এবং git statusওপি যেমন প্রত্যাশা করে ঠিক তেমনই কাজ করবে।
ক্রিস জনসন

3
আপনি যদি কোনও সাধারণ করেন তবে git commitএটি নাম পরিবর্তিত ফাইলের প্রতিশ্রুতি দেয় না এবং কার্যক্ষম গাছটি এখনও একই। git commit -aগিটের কর্মপ্রবাহ / চিন্তাভাবনার মডেলটির প্রতিটি দিকই বেশ পরাস্ত করে — প্রতিটি পরিবর্তন প্রতিশ্রুতিবদ্ধ। আপনি যদি কেবলমাত্র ফাইলটির নাম পরিবর্তন করতে index.htmlচান তবে অন্য প্রতিশ্রুতিতে পরিবর্তন আনতে চান?
নিটল

@ ক্রিস: হ্যাঁ, অবশ্যই আমি যুক্ত করেছি mobile.cssযা আমার উল্লেখ করা উচিত ছিল। তবে এটি আমার উত্তরের মূল বিষয়: ম্যান পেজটি বলছে যে the index is updatedআপনি যখন ব্যবহার করবেন git-mvstatus -aস্পষ্টতার জন্য ধন্যবাদ , আমি গিট 1.6.4 ব্যবহার করেছি
টানাসিয়াস

4
দুর্দান্ত উত্তর! git statusপুনরায় নামকরণ কেন শনাক্ত করা হচ্ছে না তা জানার চেষ্টা করে আমি প্রাচীরের বিরুদ্ধে মাথা বেঁধেছিলাম। চলমান git commit -a --dry-runআমার "নতুন" ফাইল জোড়ার পরে renames দেখিয়েছেন এবং পরিশেষে আমাকে কমিট আস্থা দিয়েছে!
স্টিফেন.হ্যানসন

1
গিট 1.9.1 এ git statusএখন আচরণ করে git commit
জ্যাক রেনে মেসরিন

77

গিট এটিকে চলাফেরার স্বীকৃতি দেওয়ার আগে আপনাকে সূচীতে দুটি পরিবর্তিত ফাইল যুক্ত করতে হবে।

mv old newএবং এর মধ্যে একমাত্র পার্থক্য git mv old newহ'ল গিট এমভিও সূচিগুলিতে ফাইল যুক্ত করে।

mv old newতাহলেও git add -Aকাজ করত।

মনে রাখবেন আপনি কেবল ব্যবহার করতে পারবেন না git add .কারণ এটি সূচকে অপসারণগুলি যোগ করে না।

"গিট অ্যাড-এ" এবং "গিট অ্যাড" এর মধ্যে পার্থক্য দেখুন


3
git add -Aলিঙ্কের জন্য ধন্যবাদ , খুব দরকারী, আমি যেমন শর্টকাট খুঁজছিলাম!
ফিলিহো

5
নোট করুন যে গিট 2 সহ সূচকে অপসারণগুলি যুক্ত git add . করে
নিক ম্যাককুরডি

19

নিজের জন্য চেষ্টা করা সেরা জিনিস।

mkdir test
cd test
git init
touch aaa.txt
git add .
git commit -a -m "New file"
mv aaa.txt bbb.txt
git add .
git status
git commit --dry-run -a

এখন গিট স্ট্যাটাস এবং গিট কমিট - ড্রি রান-এ দুটি পৃথক ফলাফল দেখায় যেখানে গিট স্ট্যাটাস bbb.txt কে নতুন ফাইল / aaa.txt মুছে ফেলা হিসাবে দেখায় এবং - - ড্রাই চালানো কমান্ডগুলি প্রকৃত নামটি দেখায় name

~/test$ git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   bbb.txt
#
# 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)
#
#   deleted:    aaa.txt
#


/test$ git commit --dry-run -a

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

এখন এগিয়ে যান এবং চেক ইন করুন।

git commit -a -m "Rename"

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

গল্পটির নৈতিকতা: আপনার ফাইলটির নতুন নাম হয়েছে কিনা তা আপনি যদি নিশ্চিত না হন তবে "গিট কমিট - ড্রি-রান -a" জারি করুন। যদি এটি প্রদর্শিত হয় যে ফাইলটির নাম পরিবর্তন করা হয়েছে, আপনি যেতে ভাল।


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

17

গিট 1.7.x এর জন্য নিম্নলিখিত কমান্ডগুলি আমার জন্য কাজ করেছে:

git mv css/iphone.css css/mobile.css
git commit -m 'Rename folder.' 

গিট অ্যাডের কোনও প্রয়োজন ছিল না, কারণ মূল ফাইলটি (যেমন সিএসএস / মোবাইল সিএসএস) আগে থেকেই প্রতিশ্রুতিবদ্ধ ফাইলগুলিতে ছিল।


6
এই. অন্যান্য সমস্ত উত্তর হাস্যকর এবং অযথা জটিল। এটি কমিটগুলির মধ্যে ফাইলের ইতিহাস বজায় রাখে যাতে ফাইলটির পুনরায় নাম ভাঙার আগে বা পরে মেশানো হয়।
ফলস্বরূপ

10

আপনার কাছে git add css/mobile.cssনতুন ফাইল রয়েছে এবং git rm css/iphone.cssতাই গিট এটি সম্পর্কে জানে। তারপরে এটি একই আউটপুট প্রদর্শন করবেgit status

আপনি এটি স্ট্যাটাস আউটপুট (ফাইলের নতুন নাম) এ স্পষ্ট দেখতে পাচ্ছেন:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)

এবং (পুরানো নাম):

# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)

আমি মনে করি পর্দার আড়ালে git mvএকটি মোড়ক স্ক্রিপ্ট ছাড়া আর কিছুই নয় যা হুবহু এটি করে: সূচিটি থেকে ফাইলটি মুছুন এবং এটিকে অন্য নামে যুক্ত করুন


আমি ভাবিনি যে আমার এটি হবে git rm css/iphone.cssকারণ আমি ভেবেছিলাম এটি বিদ্যমান ইতিহাস মুছে ফেলবে। সম্ভবত আমি কাজের ফাঁকে ভুল বুঝছি।
গ্রেগ কে

4
@ গ্রেগ কে: git rmইতিহাস সরাবে না। এটি কেবল সূচি থেকে একটি এন্ট্রি সরিয়ে দেয় যাতে পরবর্তী প্রতিশ্রুতিতে প্রবেশের ব্যবস্থা না থাকে। তবে এটি পৈতৃক কমিটে এখনও বিদ্যমান থাকবে। আপনি যা সম্পর্কে বিভ্রান্ত হতে পারেন তা হ'ল (উদাহরণস্বরূপ) git log -- newআপনি যে প্রতিশ্রুতিবদ্ধ করেছিলেন সেই স্থানে থামবে git mv old new। আপনি যদি নামগুলি অনুসরণ করতে চান তবে ব্যবহার করুন git log --follow -- new
ক্রিস জনসন

9

গিটের দৃষ্টিকোণ থেকে আপনার ফাইলগুলি সম্পর্কে চিন্তা করা যাক।

মনে রাখবেন গিট আপনার ফাইলগুলি সম্পর্কে কোনও মেটাডেটা ট্র্যাক করে না

আপনার সংগ্রহস্থলটিতে (অন্যদের মধ্যে) রয়েছে

$ cd repo
$ ls
...
iphone.css
...

এবং এটি গিট নিয়ন্ত্রণের মধ্যে রয়েছে:

$ git ls-files --error-unmatch iphone.css &>/dev/null && echo file is tracked
file is tracked

এটি দিয়ে পরীক্ষা করুন:

$ touch newfile
$ git ls-files --error-unmatch newfile &>/dev/null && echo file is tracked
(no output, it is not tracked)
$ rm newfile

যখন তুমি কর

$ mv iphone.css mobile.css

গিট দৃষ্টিকোণ থেকে,

  • কোনও আইফোন.এসএস নেই (এটি মুছে ফেলা হয়েছে - গিট এটি সম্পর্কে সতর্ক করে)।
  • একটি নতুন ফাইল আছে মোবাইল
  • এই ফাইলগুলি সম্পূর্ণ সম্পর্কিত নয়।

সুতরাং, Git ফাইল এটি আগে থেকেই জানে (প্রায় উপদেশ iphone.css ) এবং নতুন ফাইল এটি সনাক্ত ( mobile.css ) কিন্তু শুধুমাত্র যখন ফাইল তাদের বিষয়বস্তু চেক করতে সূচক অথবা HEAD Git শুরু হয়।

এই মুহুর্তে, " আইফোন.এসএস মুছে ফেলা" বা মোবাইল কোডএস সূচকে নেই on

সূচিতে আইফোন.এসএস মোছা যুক্ত করুন

$ git rm iphone.css

গিট আপনাকে যা ঘটেছে ঠিক তা বলে: ( আইফোন.এসএস মোছা হয়েছে more আর কিছুই হয়নি)

তারপরে নতুন ফাইল মোবাইল সিএসএস যুক্ত করুন

$ git add mobile.css

এবার মুছে ফেলা এবং নতুন ফাইল উভয়ই সূচকে রয়েছে। এখন গিট সনাক্ত প্রসঙ্গ একই এবং এটি একটি পুনর্নবীকরণ হিসাবে প্রকাশ করে ose আসলে ফাইলগুলি যদি ৫০% অনুরূপ হয় তবে এটি একটি নাম পরিবর্তন হিসাবে সনাক্ত করবে, যা অপারেশনটিকে একটি নতুন নাম হিসাবে রাখার সময় আপনাকে মোবাইল সিএসএস কিছুটা পরিবর্তন করতে দেয়।

দেখুন এটি পুনরুত্পাদনযোগ্য git diff। এখন আপনার ফাইলগুলি সূচকে রয়েছে আপনাকে অবশ্যই ব্যবহার করতে হবে --cachedMobile.css কে কিছুটা সম্পাদনা করুন, এটিকে সূচীতে যুক্ত করুন এবং এর মধ্যে পার্থক্যটি দেখুন:

$ git diff --cached 

এবং

$ git diff --cached -M

-Mএর জন্য "নতুন নামগুলি সনাক্ত করুন" বিকল্পটি git diff-Mএর অর্থ দাঁড়ায় -M50%(৫০% বা তার বেশি মিলের ফলে -M20%গিটটি এটির পুনর্নবীকরণ হিসাবে প্রকাশ করবে) তবে আপনি যদি মোবাইল সিএসএস অনেকগুলি সম্পাদনা করেন তবে আপনি এটিকে (20%) কমিয়ে দিতে পারেন।


8

পদক্ষেপ 1: ফাইলটিকে পুরানো ফাইল থেকে নতুন ফাইলের নামকরণ করুন

git mv #oldfile #newfile

পদক্ষেপ 2: গিট কমিট এবং মন্তব্য যুক্ত করুন

git commit -m "rename oldfile to newfile"

স্টিপি 3: এই পরিবর্তনটি রিমোট সেভারে চাপ দিন

git push origin #localbranch:#remotebranch

1
দয়া করে কিছু মন্তব্য যুক্ত করুন যাতে এটি
ওপিতে

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

7

গিট ফাইলটিকে একটি নতুন চিহ্নবিহীন ফাইল হিসাবে না দেখে বিষয়বস্তুগুলি থেকে সনাক্ত করবে

এখানেই আপনি ভুল হয়ে গেছেন।

এটি শুধুমাত্র পর আপনি ফাইল যোগ, যে Git সামগ্রী থেকে তা সনাক্ত করা হবে।


যথাযথভাবে। যখন মঞ্চস্থ গিট পুনরায় নামটি সঠিকভাবে প্রদর্শন করবে।
ম্যাক্সলিউড

3

আপনি আপনার অনুসন্ধানকারী পদক্ষেপের ফলাফল মঞ্চস্থ করেন নি। আমি বিশ্বাস করি আপনি যদি ফাইন্ডারের মাধ্যমে সরানো এবং তারপরে এটি করেন তবে git add css/mobile.css ; git rm css/iphone.cssগিটটি নতুন ফাইলের হ্যাশ গণনা করতে পারে এবং কেবল তখনই বুঝতে পারে যে ফাইলগুলির হ্যাশগুলি মিলছে (এবং এইভাবে এটি একটি নতুন নাম)।


2

আপনি যদি ফাইলগুলির প্রকৃতপক্ষে ম্যানুয়ালি নাম পরিবর্তন করতে হয় এমন ক্ষেত্রে, উদাহরণস্বরূপ। ব্যাচের স্ক্রিপ্ট ব্যবহার করে একগুচ্ছ ফাইলের নাম পরিবর্তন করে তারপরে git add -A .আমার জন্য কাজ করে ।


2

এক্সকোড ব্যবহারকারীদের জন্য: যদি আপনার ফাইলটির নাম এক্সকোডে রাখেন আপনি ব্যাজ আইকনটি সংযোজন করতে দেখবেন। আপনি যদি এক্সকোড ব্যবহার করে প্রতিশ্রুতিবদ্ধ হন তবে আপনি আসলে একটি নতুন ফাইল তৈরি করবেন এবং ইতিহাসটি হারাবেন।

একটি কার্যনির্বাহী সহজ তবে এক্সকোড ব্যবহার করে কমিট করার আগে আপনাকে এটি করতে হবে:

  1. আপনার ফোল্ডারে একটি গিট স্ট্যাটাস করুন। আপনার দেখতে হবে যে মঞ্চস্থ পরিবর্তনগুলি সঠিক:

নতুন নামকরণ করা হয়েছে: প্রকল্প / ওল্ডনেম.ই. -> প্রকল্প / নতুননাম। পুনঃনামকরণ: প্রকল্প / ওল্ডনেম.এম -> প্রকল্প / নতুন নাম.এম

  1. -ম 'নাম পরিবর্তন' কর

তারপরে এক্সকোডে ফিরে যান এবং আপনি দেখতে পাবেন ব্যাজটি এ থেকে এম তে পরিবর্তিত হয়েছে এবং এটি এখন এক্সকোড ব্যবহারের ক্ষেত্রে আরও পরিবর্তন সম্পাদন করা যায়।

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