ভেবে দেখা গেল যে গিটটি প্রতীকী লিঙ্কগুলিকে স্বীকৃত নয় যেগুলি সংগ্রহস্থলের বাইরে রয়েছে, হার্ড লিঙ্কগুলি ব্যবহার করতে কোনও সমস্যা আছে?
গিট তাদের ভেঙে দিতে পারে? আপনি কি আমাকে বিস্তারিত তথ্যের দিকে নির্দেশ করতে পারেন?
ভেবে দেখা গেল যে গিটটি প্রতীকী লিঙ্কগুলিকে স্বীকৃত নয় যেগুলি সংগ্রহস্থলের বাইরে রয়েছে, হার্ড লিঙ্কগুলি ব্যবহার করতে কোনও সমস্যা আছে?
গিট তাদের ভেঙে দিতে পারে? আপনি কি আমাকে বিস্তারিত তথ্যের দিকে নির্দেশ করতে পারেন?
উত্তর:
'ট্রি' অবজেক্ট, গিটের ডিরেক্টরি উপস্থাপন করে, ফাইলের নাম এবং (সাবসেট) অনুমতি জমা করে। এটি ইনোড নম্বর (বা অন্য ধরণের ফাইল আইডি) সঞ্চয় করে না। অতএব হার্ড লিঙ্কগুলি গিটের মধ্যে উপস্থাপন করা যায় না , অন্তত তৃতীয় পক্ষের সরঞ্জামগুলি যেমন মেটাস্টোর বা গিট-ক্যাশে-মেটা ছাড়া নাও (এবং আমি নিশ্চিত না যে এটি tools সরঞ্জামগুলির সাথেও সম্ভব কিনা)।
গিট ফাইলগুলিকে স্পর্শ না করার চেষ্টা করে যা এটি আপডেট করার দরকার নেই, তবে আপনার মনে রাখতে হবে যে গিট হার্ডলিঙ্কগুলি সংরক্ষণ করার চেষ্টা করে না, তাই সেগুলি গিট দ্বারা ভেঙে যেতে পারে।
প্রতীকী লিঙ্কগুলি সংগ্রহস্থলের বাইরের দিকে ইঙ্গিত করার বিষয়ে : গিটের সাথে তাদের কোনও সমস্যা নেই এবং প্রতীকী লিঙ্কগুলির বিষয়বস্তু সংরক্ষণ করা উচিত ... তবে এই জাতীয় লিঙ্কগুলির উপযোগিতা আমার কাছে সন্দেহজনক, কারণ এই চিহ্নগুলি ভাঙ্গা হবে বা না গিট সংগ্রহস্থলের বাইরের ফাইল সিস্টেমের বিন্যাসের উপর নির্ভর করবে , এবং গিট নিয়ন্ত্রণে নেই।
আমি জানতে পেরেছি যে, হুক ব্যবহার করে আপনি git pull
ইভেন্টটি ক্যাপচার করতে পারেন (যখন টানানোর জন্য কিছু আছে ...) স্ক্রিপ্ট ইভেন্ট হ্যান্ডলারটি .git/hooks/post-merge
ফাইল করতে পারেন।
প্রথমত, আপনি chmod +x
এটি করতে হবে।
তারপরে, ln
প্রতিটি টানে শক্ত লিঙ্কগুলি পুনরায় তৈরি করতে কমান্ডগুলি এর ভিতরে রাখুন। ঝরঝরে!
এটি কাজ করে, আমার প্রকল্পটির জন্য আমার কেবল এটির প্রয়োজন ছিল এবং ls -i
দেখায় যে ফাইলগুলি পরে স্বয়ংক্রিয়ভাবে লিঙ্ক হয়েছিল pull
।
আমার উদাহরণ .git/hooks/post-merge
:
#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf
গুরুত্বপূর্ণ: আপনি দেখতে পাচ্ছেন, আপনার সংগ্রহস্থলের যে কোনও ফাইলের পথ দিয়ে শুরু হওয়া উচিত $GIT_DIR
, তারপরে ফাইলটিতে আংশিক আপেক্ষিক পথ যুক্ত করুন।
এছাড়াও গুরুত্বপূর্ণ: -f
প্রয়োজনীয়, কারণ আপনি গন্তব্য ফাইলটি পুনরায় তৈরি করছেন।
আধুনিক গিট ক্লায়েন্ট মনে হয় স্বাভাবিকভাবেই রিপোজিটরির অভ্যন্তরে সিমলিংক এবং হার্ডলিঙ্কগুলি সমর্থন করে, এমনকি কোনও দূরবর্তী অবস্থানের দিকে ধাক্কা দেওয়ার পরেও সেখান থেকে ক্লোনিং করে। গিট রেপোর বাইরে লিঙ্ক করার আমার আর দরকার ছিল না যদিও ...
$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
3 files changed, 3 insertions(+)
create mode 100644 hardlink
create mode 120000 symlink
create mode 100644 x/original
$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink symlink x
$ cat symlink
123
$ cat hardlink
123
$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
+ 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123
https://github.com/mokacoding/symlinks এছাড়াও একটি গুরুত্বপূর্ণ বিষয় নির্দেশ করে: প্রতীকগুলি অবশ্যই তুলনামূলকভাবে সংজ্ঞায়িত করা উচিত।
জংশন পয়েন্টগুলি প্রতীকী লিঙ্ক নয়; অতএব, প্রতীকী লিঙ্কগুলি কেবল এমএসজিগিতে অসমর্থিত।
এছাড়াও, হার্ড লিঙ্কগুলি কখনও গিট দ্বারা ট্র্যাক করা যায়নি ।
ইস্যুটি উইন্ডো-ভিত্তিক ছিল (যেহেতু এটি এমএসজিগিট সম্পর্কিত) এবং সিমিলিংকের সম্ভাব্য সমর্থন সম্পর্কে বিতর্ক।
তবে হার্ড লিঙ্ক সম্পর্কে মন্তব্য গিটকে সাধারণভাবে উদ্বেগ দেয়।
গুগল 'গিট হার্ড লিঙ্কগুলি সংরক্ষণ করে' এবং এটি দেখায় যে গিট কীভাবে হার্ড লিঙ্কের কাঠামোটি আফাইককে সংরক্ষণ করতে পারে তা সম্ভবত ডিজাইনের মাধ্যমে জানে না।
আমার ওয়েব প্রকল্পগুলি নিম্নরূপে হার্ড লিঙ্কগুলি ব্যবহার করে:
www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)
me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
যদি আমি সূচি.এফপিতে পরিবর্তন করতে চাইতাম তবে আমি এটিকে এক জায়গায় পরিবর্তন করেছি এবং হার্ড লিঙ্কগুলি (পণ্যের বিবরণ পৃষ্ঠাগুলি) পরিবর্তনের দিকে ইঙ্গিত করে - ব্যতীত অন্যান্য কম্পিউটারগুলিতে ক্লোনিং এবং টান দেওয়ার সময় গিট এই সম্পর্কটিকে সংরক্ষণ করে না।
me@server:www$ git pull
অন্য একটি মেশিনে প্রতিটি হার্ড লিঙ্কের জন্য একটি নতুন সূচি.এফপি তৈরি করবে।
hardlink --ignore-time
উপর /var/lib/jenkins
, কিছু ডিস্ক স্থান পুনরায় দাবি করার। দিনের বেলা কিছু ফাইল আবার অযৌক্তিকভাবে যুক্ত হয় git pull
বা পরে mvn compile
তবে এটি ঠিক আছে, আমি আশা করি এটি ঘটবে। যদি গিটটি হার্ড লিঙ্কগুলি সংরক্ষণ করে তবে আমার ডিস্ক স্পেস পুনর্ব্যবহার করার কৌশলটি কাজ করবে না।