গিট কীভাবে প্রতীকী লিঙ্কগুলি পরিচালনা করে?


1606

আমার কাছে যদি এমন কোনও ফাইল বা ডিরেক্টরি থাকে যা প্রতীকী লিঙ্ক এবং আমি এটি একটি গিট সংগ্রহস্থলের কাছে প্রতিশ্রুতিবদ্ধ করি তবে তাতে কী ঘটে?

আমি ধরে নেব যে ফাইলটি মুছে ফেলা না হওয়া পর্যন্ত এটি একটি প্রতীকী লিঙ্ক হিসাবে ছেড়ে যায় এবং তারপরে আপনি যদি কোনও পুরানো সংস্করণ থেকে ফাইলটি টানেন তবে এটি কেবল একটি সাধারণ ফাইল তৈরি করে।

আমি রেফারেন্সী ফাইলটি মুছলে এটি কী করবে? এটি কি কেবল ঝুঁকির লিঙ্কটি করে?


19
.gitignoreসিমলিংকটিকে কোনও ফোল্ডার নয় ফাইল হিসাবে দেখায়।
0xcaff

6
ঠিক আছে, স্পষ্টতই প্রশ্নের উত্তরটির চেয়ে আরও বেশি কিছু রয়েছে। উদাহরণস্বরূপ, আমি নিম্নলিখিতগুলি অবাক করে দিচ্ছি: যদি আমি আমার ভাণ্ডারে কোনও সিম লিঙ্ক তৈরি করি that os os large? Os os os os os os os os os changes changes changes changes those changes changes বৃহত ফাইলটি উভয় স্থানেই একটি বৃহত ফাইল হিসাবে সংরক্ষণ করা হবে, অথবা নতুন মেশিনে লিঙ্ক ফাইলটি মূল বড় ফাইলটির দিকে নির্দেশ করবে যেমন সিম লিঙ্কটি সংরক্ষণ করা হবে?
jvriesem

7
এটি একটি পুরানো থ্রেড তবে এই মন্তব্যটি এখনও কার্যকর হতে পারে। Jviesem এর প্রতিক্রিয়া হিসাবে, একটি সফ্ট লিঙ্কটি মূলত অন্য ফাইলের নামের একটি ফাইল। সুতরাং একবার আপনি এটি অন্য কোনও মেশিনে টানলে, লিঙ্কটি ডাউনলোড হয়ে যাবে এবং এতে মূল ফাইল সিস্টেমে বড় ফাইলটির নাম থাকবে। নতুন মেশিনে যদি নামটি বৈধ নয়, তবে লিঙ্কটির একটি অবৈধ নাম থাকবে। বড় ফাইলটি নতুন মেশিনে ডাউনলোড করা হবে না।
লাসারো

6
@ আলাসারো, গিট রেপোতে ভাঙা লিঙ্কগুলি এড়ানোর উপায় হ'ল ../..প্রয়োজন হিসাবে ব্যবহার করে সিমলিংকগুলি তৈরি করার সময় সর্বদা আপেক্ষিক পাথ ব্যবহার করা।
ওয়াইল্ডকার্ড

8
লক্ষ্য করুন যে উইন্ডোজের বেশিরভাগ সংস্করণে আপনার একটি সিলিমিংক তৈরি করার জন্য উন্নত অনুমতি প্রয়োজন। আপনি যদি উইন্ডোজে থাকেন এবং git pullসিমলিংকের পরিবর্তে একটি ফাইল তৈরি করেন তবে প্রশাসক হিসাবে গিট ক্লায়েন্ট চালানোর চেষ্টা করুন।
axmrnv

উত্তর:


1347

গিট কেবলমাত্র লিঙ্কের বিষয়বস্তুগুলি (যেমন ফাইল সিস্টেমের সাথে এটির লিঙ্কের পথ) এটি একটি 'ব্লব'-তে সংরক্ষণ করে যেমন এটি একটি সাধারণ ফাইলের জন্য। এরপরে গাছের বস্তুতে এটি নাম, মোড এবং টাইপ (এটি একটি সিমিলিংক সহ সত্য) সংরক্ষণ করে যা এতে উপস্থিত ডিরেক্টরিটি উপস্থাপন করে।

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

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


328
BTW। আপনি যদি FAT এর মতো ফাইল সিস্টেমে থাকেন যা প্রতীকী লিঙ্কগুলিকে সমর্থন করে না এবং আপনার সংগ্রহশালাগুলি সেগুলি ব্যবহার করে, আপনি core.symlinksকনফিগারেশন ভেরিয়েবলটিকে মিথ্যাতে সেট করতে পারেন, এবং লিঙ্কের পাঠ্যযুক্ত ছোট প্লেইন টেক্সট ফাইল হিসাবে সিমলিংকগুলি পরীক্ষা করা হবে।
জাকুব নরবস্কি

14
@ জাকুবনারাইবস্কি আমি এটি আগে দেখেছি। আমাদের রেপোতে একটি লাইনের সাথে একটি পাঠ্য ফাইল ছিল, আমরা ব্যবহার করি এমন একটি লাইব্রেরির পাথ। এর উদ্দেশ্য কী তা বুঝতে পারিনি। আমি জানি এখন কি হয়েছে।
ম্যাট কে

25
আমি অত্যন্ত উত্সাহিত উত্তর সম্পর্কে মন্তব্য করতে দ্বিধা বোধ করি তবে আমি মনে করি যে "নতুন ফাইলের জন্য এটি ঠিক তেমনই" শব্দবন্ধটি নতুনদের জন্য বিভ্রান্তিকর হতে পারে।
ম্যাথু হ্যানিগান

10
(সম্পাদনার সময় শেষ হয়ে গেল) এটি কেবলমাত্র একটি সাধারণ ফাইলের মতো যা কেবল বিষয়বস্তুতে একটি ব্লব থাকে। গুরুতর পার্থক্যটি হ'ল একটি সাধারণ ফাইলের জন্য ব্লব ফাইলের বিষয়বস্তু হয় তবে একটি সিমিলিংকের জন্য ব্লবটি যে ফাইলটির সাথে লিঙ্ক করে তার পথ নাম থাকে। @ জাকুবনারাইবস্কি "ছোট ছোট প্লেইন ফাইলগুলি" সম্পর্কিত .. আপনি আশা করবেন যে সেগুলি ছোট এবং পাঠ্য তবে অবশ্যই একটি ব্লব একটি ব্লব এবং সম্ভাব্যভাবে বিশাল এবং বাইনারি হতে পারে। যখন কোনও ফাইলকে একটি সিমলিংক হিসাবে ভুল টাইপ করা হয় তার জন্য stackoverflow.com/questions/18411200/… দেখুন ।
ম্যাথু হ্যানিগান

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

250

গিট কোনও ফাইলের সাথে কী করে তা আপনি সূচীতে যুক্ত করার পরে এটি কী করে তা খুঁজে পেতে পারেন। সূচকটি একটি পূর্ব-প্রতিশ্রুতি মত। প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধতার সাথে, আপনি সূচীতে git checkoutযা কিছু ছিল তা কার্যকারী ডিরেক্টরিতে ফিরিয়ে আনতে ব্যবহার করতে পারেন । সুতরাং, আপনি যখন সূচকে একটি প্রতীকী লিঙ্ক যুক্ত করবেন তখন গিট কী করবে?

এটি জানতে, প্রথমে একটি প্রতীকী লিঙ্ক তৈরি করুন:

$ ln -s /path/referenced/by/symlink symlink

গিট এই ফাইলটি সম্পর্কে এখনও জানে না। git ls-filesআপনাকে আপনার সূচিটি পরীক্ষা করতে দেয় ( -sপ্রিন্টগুলির statমতো আউটপুট):

$ git ls-files -s ./symlink
[nothing]

এখন, গিট অবজেক্ট স্টোরে প্রতীকী লিঙ্কের বিষয়বস্তুগুলি সূচকে যুক্ত করে যুক্ত করুন। আপনি যখন সূচীতে কোনও ফাইল যুক্ত করেন, গিট তার বিষয়বস্তুগুলি গিট অবজেক্ট স্টোরে সংরক্ষণ করে।

$ git add ./symlink

তো, কী যুক্ত হয়েছিল?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink

হ্যাশটি প্যাকেটজাত বস্তুর একটি উল্লেখ যা গিট অবজেক্ট স্টোরটিতে তৈরি হয়েছিল। আপনি যদি .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15cআপনার সংগ্রহস্থলের মূলটি দেখেন তবে আপনি এই বস্তুটি পরীক্ষা করতে পারেন । গিটটি সেই ফাইলটি সংগ্রহস্থলীতে সঞ্চয় করে যা আপনি পরে পরীক্ষা করে দেখতে পারেন। আপনি যদি এই ফাইলটি পরীক্ষা করেন তবে দেখতে পাবেন এটি খুব ছোট। এটি লিঙ্কযুক্ত ফাইলের সামগ্রী সংরক্ষণ করে না।

(দ্রষ্টব্য আউটপুটে 120000তালিকাভুক্ত মোড ls-filesIt এটি 100644নিয়মিত ফাইলের মতো কিছু হবে ))

কিন্তু গিট এই বস্তুর সাথে কী করবে যখন আপনি এটি সংগ্রহস্থল থেকে এবং আপনার ফাইল সিস্টেমে পরীক্ষা করে দেখেন? এটি core.symlinksকনফিগারেশনের উপর নির্ভর করে । থেকে man git-config:

core.symlinks

যদি মিথ্যা হয়, প্রতীকী লিঙ্কগুলি ছোট প্লেইন ফাইল হিসাবে চেক আউট হয়ে থাকে যা লিঙ্কটির পাঠ্য ধারণ করে।

সুতরাং, সংগ্রহস্থলের একটি প্রতীকী লিঙ্ক সহ, চেকআউট করার পরে আপনি একটি সম্পূর্ণ ফাইল সিস্টেমের পাথের উল্লেখ সহ একটি পাঠ্য ফাইল পাবেন বা core.symlinksকনফিগারেশনের মানের উপর নির্ভর করে একটি সঠিক প্রতীকী লিঙ্ক পাবেন ।

যে কোনও উপায়ে, সিমলিংক দ্বারা রেফারেন্স করা ডেটা সংগ্রহস্থলে সংরক্ষণ করা হয় না।


1
ভয়াবহ উত্তর
সার্ভ এড

147

"সম্পাদক" নোট: এই পোস্টে পুরানো তথ্য থাকতে পারে। ১.6.১.২০১৮ সাল থেকে গিতের পরিবর্তন সম্পর্কিত মন্তব্য এবং এই প্রশ্নটি দেখুন ।

প্রতীকযুক্ত ডিরেক্টরি:

কোনও ডিরেক্টরি যেখানে নরম লিঙ্ক থাকে তখন কী ঘটে তা লক্ষ করা গুরুত্বপূর্ণ। কোনও আপডেটের সাথে কোনও গিট টান লিঙ্কটি সরিয়ে দেয় এবং এটি একটি সাধারণ ডিরেক্টরি করে তোলে। এটিই আমি কঠিন উপায়ে শিখেছি। এখানে এবং এখানে কিছু অন্তর্দৃষ্টি

উদাহরণ

আগে

 ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir

git add/commit/push

It remains the same

এর পরে git pullএবং কিছু আপডেট পাওয়া গেছে

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir

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

উপরের আচরণটি 1.6.5.6 গিট দিয়ে পরীক্ষা করা হয়েছে; তবে আমি দৃ strongly়ভাবে সন্দেহ করি যে বেশ কিছুদিন ধরে সংস্করণিত আচরণ গিটের মধ্যে সঠিক ছিল।
জন হুইটলি

22
এই আচরণটি গিটের সমস্ত সংস্করণে উপস্থিত রয়েছে বা এটির সাথে সংশোধন করা হয়েছে?
jbotnik

24
এটি দেখে মনে হচ্ছে এই আচরণ এখন সংশোধন করা হয়েছে, দেখুন: stackoverflow.com/a/1943656/1334781
রন Wertlen

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