আমার সেরাটি কি শেল স্ক্রিপ্ট হতে চলেছে যা প্রতিলিপিগুলি প্রতিলিপিগুলির সাথে প্রতিস্থাপন করে, বা গিটকে সিমলিংক অনুসরণ করতে বলার অন্য কোনও উপায় আছে?
PS: আমি জানি এটি খুব নিরাপদ নয়, তবে আমি কেবল কয়েকটি নির্দিষ্ট ক্ষেত্রে এটি করতে চাই।
আমার সেরাটি কি শেল স্ক্রিপ্ট হতে চলেছে যা প্রতিলিপিগুলি প্রতিলিপিগুলির সাথে প্রতিস্থাপন করে, বা গিটকে সিমলিংক অনুসরণ করতে বলার অন্য কোনও উপায় আছে?
PS: আমি জানি এটি খুব নিরাপদ নয়, তবে আমি কেবল কয়েকটি নির্দিষ্ট ক্ষেত্রে এটি করতে চাই।
উত্তর:
দ্রষ্টব্য: এই পরামর্শটি এখন গিট 1.6.1 থেকে মন্তব্য অনুযায়ী সেকেলে। গিট এইভাবে আচরণ করত এবং আর করে না।
গিট ডিফল্টরূপে সিমলিঙ্কগুলি অনুসরণ করার পরিবর্তে সংরক্ষণের চেষ্টা করে (সংক্ষিপ্ততার জন্য, এবং এটি সাধারণত লোকেরা যা চায়)।
যাইহোক, যখন সিমিলিংক ডিরেক্টরি হয় তখন আমি দুর্ঘটনাক্রমে এটি সিমলিংকের বাইরে ফাইলগুলি যুক্ত করতে সক্ষম করেছিলাম।
অর্থাৎ,
/foo/
/foo/baz
/bar/foo --> /foo
/bar/foo/baz
করেছে
git add /bar/foo/baz
এটি চেষ্টা করার সময় এটি কাজ করতে উপস্থিত হয়েছিল। সেই আচরণটি তখন আমার দ্বারা অযাচিত ছিল, সুতরাং আমি আপনাকে এর বাইরে তথ্য দিতে পারি না।
গিটে একটি সিমিলিঙ্কের মধ্যে ফাইলগুলি পেতে আমি কী যুক্ত করেছি (আমি একটি সিমলিংক ব্যবহার করি নি তবে):
sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
গিট-পরিচালিত ডিরেক্টরিতে এই কমান্ডটি করুন। এটিতে মাউন্ট দেওয়ার TARGETDIRECTORY
আগে তৈরি SOURCEDIRECTORY
করতে হবে।
এটি লিনাক্সে দুর্দান্ত কাজ করে তবে ওএস এক্সে নয়! সেই কৌশলটি আমাকে সাবভার্সনেও সহায়তা করেছিল। আমি ড্রপবক্স অ্যাকাউন্ট থেকে ফাইলগুলি অন্তর্ভুক্ত করার জন্য এটি ব্যবহার করি, যেখানে কোনও ওয়েব ডিজাইনার তার জিনিসগুলি করেন।
umount [mydir]
। (আপনার দুর্দান্ত টিপের জন্য +1, @ ব্যবহারকারী 252400)
অন্য উপায়ে সিমলিংক তৈরি করবেন না কেন? মানে গিট সংগ্রহশালা থেকে অ্যাপ্লিকেশন ডিরেক্টরিতে লিঙ্ক না করে কেবল অন্য উপায়ে লিঙ্ক করুন।
উদাহরণস্বরূপ, ধরা যাক আমি ইনস্টল করা একটি অ্যাপ্লিকেশন সেটআপ করছি যাটির জন্য ~/application
একটি কনফিগারেশন ফাইল প্রয়োজন config.conf
:
config.conf
আমার গিট ভাণ্ডারে যুক্ত করছি, উদাহরণস্বরূপ, এ ~/repos/application/config.conf
।~/application
চালিয়ে একটি সিমিলিংক তৈরি করি ln -s ~/repos/application/config.conf
।এই পদ্ধতির সর্বদা কার্যকর নাও হতে পারে তবে এটি আমার পক্ষে এখনও পর্যন্ত ভালভাবে কাজ করেছে।
পরিবর্তে হার্ড লিঙ্কগুলি ব্যবহার করুন। এটি একটি নরম (প্রতীকী) লিঙ্ক থেকে পৃথক। সহ সমস্ত প্রোগ্রাম git
ফাইলটিকে একটি নিয়মিত ফাইল হিসাবে বিবেচনা করবে। মনে রাখবেন যে, বিষয়বস্তু পরিবর্তন করে পরিবর্তন করা যাবে পারেন উত্স অথবা গন্তব্য।
আপনার যদি ইতিমধ্যে গিট এবং এক্সকোড ইনস্টল করা থাকে তবে হার্ডলিঙ্কটি ইনস্টল করুন । হার্ড লিঙ্কগুলি তৈরি করার জন্য এটি একটি মাইক্রোস্কোপিক সরঞ্জাম ।
হার্ড লিঙ্কটি তৈরি করতে, সহজভাবে:
hln source destination
অ্যাপল ফাইল সিস্টেম ডিরেক্টরি হার্ড লিঙ্ক সমর্থন করে?
ডিরেক্টরি হার্ড লিঙ্কগুলি অ্যাপল ফাইল সিস্টেম দ্বারা সমর্থিত নয়। আপনি যখন ম্যাকোজে এইচএফএস + থেকে এপিএফএস ভলিউম ফর্ম্যাটে রূপান্তর করেন তখন সমস্ত ডিরেক্টরি হার্ড লিঙ্কগুলি প্রতীকী লিঙ্ক বা উপাধিতে রূপান্তরিত হয়।
ভবিষ্যতের বিকল্পগুলির জন্য https://github.com/selkhateeb/hardlink/issues/31 অনুসরণ করুন ।
ln
কমান্ড হার্ড লিঙ্ক করতে পারেন:
ln source destination
কেউ উইন্ডোজে একটি জংশন তৈরি করতে এমকিঙ্কিং ব্যবহার করার পরামর্শ দিয়েছিলেন , তবে আমি এটি চেষ্টা করে দেখিনি:
mklink /j "source" "destination"
ln source destination
ওএস এক্সেও কাজ করে। এল ক্যাপিটনে পরীক্ষিত।
cp -al source destination
। `-l এর অর্থ অনুলিপি না করে হার্ড লিঙ্ক ফাইলগুলি।
এটি একটি প্রাক-প্রতিশ্রুতিযুক্ত হুক যা সেই সূত্রগুলির বিষয়বস্তু সহ সূচকে থাকা সিমলিংক ব্লবকে প্রতিস্থাপন করে।
এটি রাখুন .git/hooks/pre-commit
এবং কার্যকর করুন:
#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)
# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
"process_links_to_nondir" {} ';'
# the end
আমরা পসিক্স যথাসম্ভব সুসংগত কার্যকারিতা ব্যবহার করি; তবে diff -a
পসিক্স অনুগত নয়, সম্ভবত অন্যান্য জিনিসগুলির মধ্যে রয়েছে।
এই কোডটিতে কিছু ভুল / ত্রুটি থাকতে পারে, যদিও এটি কিছুটা পরীক্ষা করা হয়েছিল।
typechange
মধ্যে git status
ফাইল যা আসলে symlinks যদিও এখন Git জিনিষ তারা না জন্য।
process_links_to_nondir
?
argv[0]
যা sh
প্রক্রিয়াটির কমান্ড-নাম হিসাবে ব্যবহৃত হয় । (এটি অনুমান করার জন্য আমাকে খানিকটা চেষ্টা করলেন, যেহেতু এটি কোনটি আমি মনে করি না ☺😃)
find: missing argument to -exec'
। পাইপিং এবং সবকিছুকে একক লাইনে একত্রিত করার পরিবর্তে ধাপে ধাপে কমান্ডের প্রয়োগের প্রয়োজন হতে পারে।
typechange
হুকটি প্রত্যাশার মতো কাজ করে না (আমি @ ডেভিডফ্রেজারের মতো পাই, তবে লিঙ্কযুক্ত ফাইলটি আর মঞ্চস্থ হয় না বলে মনে হয়)
চালু MacOS
(আমার মোজভে / 10.14, git
সংস্করণ ২.7.১) আছে, ব্যবহার করুন bindfs
।
brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>
এটি অন্যান্য মন্তব্যে ইঙ্গিত দেওয়া হয়েছে, তবে অন্য উত্তরে পরিষ্কারভাবে সরবরাহ করা হয়নি। আশা করি এটি কারও কিছুটা সময় সাশ্রয় করবে।
Failed to resolve
... No such file or directory
ত্রুটিগুলি যদি না কমান্ডের সাথে পুরো পথের নাম ব্যবহার করি bindfs
।
আমি বেশ কিছুদিন ধরে সিমলিংকের বাইরেও ফাইল যুক্ত করতাম। এটি কোনও বিশেষ ব্যবস্থা না করে ঠিক কাজ করত। যেহেতু আমি গিট ১.6.১ এ আপডেট করেছি তাই এটি আর কাজ করে না।
এই কাজটি করতে আপনি গিট 1.6.0 এ স্যুইচ করতে পারবেন। আমি আশা করি যে গীতের ভবিষ্যতের সংস্করণে git-add
এটি আবার সিমলিংকগুলি অনুসরণ করার অনুমতি দেওয়ার জন্য একটি পতাকা থাকবে ।
আমি এখানে প্রতিটি সমাধানকে পুরানো বা মূলের প্রয়োজন থেকে ক্লান্ত হয়ে পড়েছি, তাই আমি একটি LD_PRELOAD- ভিত্তিক সমাধান তৈরি করেছি (কেবলমাত্র লিনাক্স)।
এটি গিটের অভ্যন্তরীণ অংশে প্রবেশ করে, 'এটি কি একটি সিমলিংক?' ফাংশন, প্রতিলিঙ্কগুলি তাদের বিষয়বস্তু হিসাবে বিবেচনা করার অনুমতি দেয়। ডিফল্টরূপে, রেপোর বাইরের সমস্ত লিঙ্ক অন্তর্ভুক্ত থাকে; বিস্তারিত জানার জন্য লিঙ্কটি দেখুন।
LD_PRELOAD
গ্রন্থাগারের ফাংশনগুলিকে ওভাররাইড করতে খুব সৃজনশীল সমাধান !
গীত সঙ্গে 2.3.2+ (চতুর্থাংশ 1 2015), সেখানে অন্য একজন যদি যেখানে গীত হবে না আর সিমবলিক লিঙ্ক অনুসরণ করুন: দেখুন e0d201b কমিট দ্বারা junio সি Hamano ( gitster
) (প্রধান গীত রক্ষণাবেক্ষণকারী)
apply
: প্রতীকী লিঙ্কের বাইরে কোনও ফাইল স্পর্শ করবেন নাযেহেতু গিট প্রতীকী লিঙ্কগুলি প্রতীকী লিঙ্ক হিসাবে চিহ্নিত করে, একটি পথ যেটির প্রধান অংশে একটি প্রতীকী লিঙ্ক রয়েছে (যেমন
path/to/dir/file
,path/to/dir
অন্য কোথাও যেখানে প্রতীকী লিঙ্ক রয়েছে, এটি কার্যত গাছের অভ্যন্তরে বা বাইরে থাকুক) কখনই এমন প্যাচটিতে উপস্থিত হতে পারে না যা বৈধভাবে প্রয়োগ হয় , যদি না একই প্যাচটি প্রথমে প্রতীকী লিঙ্কটি সরিয়ে দেয় সেখানে ডিরেক্টরি তৈরি করার অনুমতি দেয়।এই জাতীয় প্যাচ সনাক্ত করুন এবং প্রত্যাখ্যান করুন।
একইভাবে, যখন কোনও ইনপুট একটি প্রতীকী লিঙ্ক
path/to/dir
তৈরি করে এবং তারপরে একটি ফাইল তৈরি করেpath/to/dir/file
, আমাদেরpath/to/dir
ফাইল সিস্টেমে আসলে প্রতীকী লিঙ্ক তৈরি না করে এটিকে ত্রুটি হিসাবে চিহ্নিত করতে হবে ।পরিবর্তে, ইনপুটটির কোনও প্যাচের জন্য যা কোনও পাথ ছেড়ে দেয় (অর্থাত্ একটি মুছে ফেলা না হয়), ফলস্বরূপ গাছের বিপরীতে আমরা সমস্ত নেতৃস্থানীয় পাথগুলি পরীক্ষা করি যা প্যাচটি ইনপুটটির সমস্ত প্যাচগুলি পরীক্ষা করে এবং তারপরে প্যাচের লক্ষ্য নির্ধারণ করে would অ্যাপ্লিকেশন (হয় সূচক বা কার্যকারী গাছ)।
এইভাবে, আমরা:
- একই সময়ে প্রতীকী লিঙ্ক
path/to/dir
এবং একটি ফাইল যুক্ত করতে কোনও দুষ্টুমি বা ভুল ধরাpath/to/dir/file
,- একটি বৈধ প্যাচ অনুমতি দেওয়ার সময় যা একটি প্রতীকী সরিয়ে দেয়
link path/to/dir
এবং তারপরে একটি ফাইল যুক্ত করেpath/to/dir/file
।
তার অর্থ, সেই ক্ষেত্রে ত্রুটি বার্তাটি জেনেরিকের মতো হবে না "%s: patch does not apply"
, তবে আরও নির্দিষ্ট একটি:
affected file '%s' is beyond a symbolic link
হুঁ, mount --bind
ডারউইনের উপর কাজ করবে বলে মনে হচ্ছে না।
কারও কি এমন কৌশল আছে যা আছে?
[সম্পাদিত]
ঠিক আছে, আমি খুঁজে পেয়েছি ম্যাক ওএস এক্স এর উত্তরটি একটি হার্ডলিঙ্ক করা। যে এপিআই এর মাধ্যমে উন্মুক্ত হয় না ln
, সুতরাং আপনার এটি করতে আপনার নিজের ক্ষুদ্র প্রোগ্রামটি ব্যবহার করতে হবে। এখানে সেই প্রোগ্রামটির একটি লিঙ্ক দেওয়া হল:
ম্যাক ওএস এক্সে ডিরেক্টরি হার্ড লিঙ্ক তৈরি করা হচ্ছে
উপভোগ করুন!
আমি গিট 1.5.4.3 ব্যবহার করছি এবং এটিতে পাস করা স্লিমিংকটি অনুসরণ করছে যদি এটির পিছনে স্ল্যাশ থাকে। যেমন
# Adds the symlink itself
$ git add symlink
# Follows symlink and adds the denoted directory's contents
$ git add symlink/
fatal: 'src/' is beyond a symbolic link
সিমলিংক থেকে রূপান্তর দরকারী হতে পারে। স্ক্রিপ্ট দ্বারা একটি সিমিলিংকের পরিবর্তে গিট ফোল্ডারে লিঙ্ক করুন ।