كيف يمكنني الحصول على بوابة لمتابعة روابط الرمزية?

StackOverflow https://stackoverflow.com/questions/86402

  •  01-07-2019
  •  | 
  •  

سؤال

أفضل سيكون قذيفة النصي الذي يستبدل روابط الرمزية مع نسخ ، أو هل هناك طريقة أخرى أقول بوابة لمتابعة روابط الرمزية?

PS:وأنا أعلم أنها ليست آمنة جدا ، أريد فقط أن تفعل ذلك في بضع حالات محددة.

هل كانت مفيدة؟

المحلول

ملاحظة: هذه النصيحة هي الآن خارج مؤرخة كما في تعليق منذ جيت 1.6.1.بوابة اعتادت أن تتصرف بهذه الطريقة و لم يعد.


بوابة افتراضيا محاولات لتخزين روابط الرمزية بدلا من اتباع لهم (على الاكتناز ، و عموما ما يريده الناس).

ومع ذلك, أنا بطريق الخطأ تمكنت من الحصول لإضافة ملفات إلى أبعد من الارتباط الرمزي عند الارتباط الرمزي هو الدليل.

I. e.:

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

عن طريق القيام

 git add /bar/foo/baz

يبدو أن العمل عندما حاولت ذلك.هذا السلوك كان ذلك غير مرغوب فيه من قبل لي في ذلك الوقت, لذلك لا أستطيع أن أعطيك معلومات أبعد من ذلك.

نصائح أخرى

ماذا فعلت إضافة إلى الحصول على الملفات داخل والرمزي في بوابة (لم استخدم الارتباط الرمزي ولكن):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

هل هذا الأمر في بوابة تمكنت الدليل. TARGETDIRECTORY لابد من خلق قبل SOURCEDIRECTORY هي التي شنت في ذلك.

أنه يعمل بشكل جيد على لينكس ، ولكن ليس على OS X!هذه الخدعة ساعدني التخريب أيضا.أنا استخدامها لتشمل الملفات من حساب دروببوإكس ، حيث webdesigner هل له/لها الأشياء.

لماذا لا إنشاء روابط الرمزية العكس ؟ يعني بدلا من ربط من بوابة مستودع إلى دليل التطبيق فقط رابط العكس.

على سبيل المثال, دعونا نقول أنا إنشاء تطبيق مثبت في ~/application الذي يحتاج إلى ملف التكوين config.conf:

  • إضافة config.conf إلى Git ، على سبيل المثال ، ~/repos/application/config.conf.
  • ثم إنشاء والرمزي من ~/application عن طريق تشغيل ln -s ~/repos/application/config.conf.

هذا النهج قد لا تعمل دائما ، لكنها عملت بشكل جيد بالنسبة لي حتى الآن.

استخدام وصلات الصلب بدلا من ذلك.وهذا يختلف من لينة (رمزية) الرابط.جميع البرامج ، بما في ذلك git علاج الملف باسم ملف منتظم.لاحظ أن محتويات يمكن تعديلها عن طريق تغيير إما المصدر أو الوجهة.

على ماك (قبل 10.13 سييرا عالية)

إذا كان لديك بالفعل بوابة كسكودي المثبتة ، تثبيت hardlink.إنه المجهري أداة لإنشاء ارتباطات ثابتة.

إنشاء ارتباط ثابت ، ببساطة:

hln source destination

ماك سييرا عالية التحديث

هل أبل دعم نظام الملفات الدليل الثابت الروابط ؟

الدليل الثابت الروابط غير معتمدة من قبل شركة آبل نظام الملفات.كل دليل من الصعب الروابط المحولة إلى روابط رمزية أو الأسماء المستعارة عند التحويل من HFS+ إلى APFS حجم الأشكال على ماك.

من APFS التعليمات على developer.apple.com

اتبع https://github.com/selkhateeb/hardlink/issues/31 المستقبل البدائل.

على لينكس و يونكس الأخرى النكهات

على ln القيادة يمكن أن تجعل من الصعب الروابط:

ln source destination

على ويندوز (Vista, 7, 8, ...)

اقترح شخص ما استخدام mklink إنشاء تقاطع على ويندوز, ولكن أنا لم تكن قد حاولت ذلك:

mklink /j "source" "destination"

هذا هو قبل ارتكاب هوك الذي يحل محل الارتباط الرمزي النقط في المؤشر ، مع مضمون هذه روابط الرمزية.

ضع هذا في .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

ملاحظات

نحن نستخدم POSIX متوافقة مع وظائف قدر الإمكان ؛ ومع ذلك ، diff -a لا POSIX متوافقة ، ربما من بين أمور أخرى.

قد يكون هناك بعض أخطاء/أخطاء في هذا القانون ، على الرغم من أنه تم اختبار إلى حد ما.

أنا استخدامها لإضافة ملفات تتجاوز روابط الرمزية لبعض الوقت الآن.كان هذا العمل على ما يرام ، دون اتخاذ أي ترتيبات خاصة.منذ تحديث بوابة 1.6.1 هذا لا يعمل أي أكثر من ذلك.

كنت قد تكون قادرة على التحول إلى بوابة 1.6.0 لجعل هذا العمل.أتمنى أن النسخة المقبلة من بوابة لديهم العلم git-add مما يتيح له متابعة روابط الرمزية مرة أخرى.

لقد تعبت من كل الحل هنا إما أن عفا عليها الزمن أو التي تتطلب الجذر ، لذلك لقد قمت LD_PRELOAD الحل القائم على (لينكس فقط).

عليه خطاطيف في بوابة الداخلية ، تجاوز هذا الارتباط الرمزي?' وظيفة ، مما يسمح روابط الرمزية أن يعامل على محتوياتها.افتراضي جميع الروابط خارج الريبو هي inlined;راجع الرابط لمزيد من التفاصيل.

مع بوابة 2.3.2+ (Q1 2015) ، وهناك حالة أخرى حيث سوف Git لا اتبع الارتباط الرمزي بعد الآن:انظر ارتكاب e0d201b قبل Junio ج Hamano (gitster) (الرئيسية بوابة معيل)

apply:لا تلمس ملف وراء ارتباط رمزي

لأن بوابة المسارات الروابط رمزية رمزية الروابط المسار الذي لديه ارتباط رمزي في الرائد جزء (مثلا ، path/to/dir/file, حيث path/to/dir هو ارتباط رمزي إلى مكان آخر ، سواء كان ذلك داخل أو خارج العمل شجرة) يمكن أن تظهر أبدا في التصحيح يصح أن ينطبق إلا نفس التصحيح الأولى يزيل الارتباط الرمزي للسماح دليل على أن تنشأ هناك.

الكشف عن رفض مثل هذا التصحيح.

وبالمثل ، عند إدخال يخلق ارتباط رمزي path/to/dir ثم يقوم بإنشاء ملف path/to/dir/file, نحن بحاجة إلى العلم أنها خطأ في الواقع دون خلق path/to/dir الارتباط الرمزي في نظام الملفات.

بدلا من ذلك, في أي رقعة في مدخلات أن يترك الطريق (أيعدم الحذف) في النتيجة ، نحن تحقق من كل الرائدة مسارات ضد الناتجة الشجرة أن التصحيح من شأنه أن يخلق من خلال فحص جميع بقع في المدخلات ومن ثم الهدف من تطبيق التصحيح (أي مؤشر أو شجرة العمل).

بهذه الطريقة:

  • ألحق الأذى أو خطأ لإضافة ارتباط رمزي 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 لا يبدو أن العمل على داروين.

لا أحد يملك حيلة ؟

[تحرير]

حسنا, لقد وجدت الإجابة على نظام التشغيل Mac OS X هو جعل hardlink.إلا أن هذا API يتم كشفها عن طريق ln, لذلك لديك لاستخدام الخاص بك البرنامج الصغير للقيام بذلك.هنا هو ارتباط إلى هذا البرنامج:

إنشاء الدليل الثابت الروابط في نظام التشغيل Mac OS X

استمتع!

على MacOS (عندي موهافي/ 10.14, git النسخة 2.7.1), استخدام bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

كان ألمح من خلال تعليقات أخرى ، ولكن ليس من الواضح المقدمة في إجابات أخرى.نأمل أن هذا يحفظ شخص بعض الوقت.

أنا باستخدام بوابة 1.5.4.3 وانها التالية مرت الارتباط الرمزي إذا كان لديه مائل زائدة.E. g.

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

التحويل من روابط الرمزية يمكن أن تكون مفيدة.الرابط في بوابة المجلد بدلا من الارتباط الرمزي من قبل البرنامج النصي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top