لا يمكنني العثور على أي مستندات حول كيفية تحليل بنية ملف الاستثناءات.
أي هل يدعم أحرف البدل؟ regex؟ كيف يفرق بين الملفات والدلائل؟ هل بادئات المسار مطلوبة؟ من أين (cwd / or root؟)؟
بعض الأمثلة:
.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
مرحبا هل رأيت
تستخدم الأنماط filepath.Glob داخليًا ، راجع filepath.Match للحصول على بناء الجملة. بالإضافة إلى ذلك ** يستبعد الدلائل الفرعية التعسفية. يتم توسيع متغيرات البيئة في ملفات الاستبعاد باستخدام os.ExpandEnv.
في https://github.com/restic/restic/blob/master/doc/manual.rst؟
أعتقد أن هذا يجب أن يجيب على أسئلتك.
ذهبت إلى الوثائق على https://restic.readthedocs.io/en/latest/manual.html وبحثت عن استبعاد ، حيث لا يتضمن للأسف أي أمثلة شائعة (أو إشارة إلى الوثائق الأخرى في manual.rst ): /
قرأت مستند golang وأعتقد أن المستخدم النهائي (أنا!) لن يعرف ما الذي يقارن restic استبعادًا داخليًا - هل هو المسار الكامل (على سبيل المثال / home / me / blah) أم مسارًا من جذر المستودع (/ بلاه أو بلاه) ، أو نسبيًا لـ cwd (أنا / بلاه عندما أكون في المنزل)؟
شكرًا لإثارة هذه المشكلة ، أعتقد أن لديك وجهة نظر صحيحة. يجب أن يشرح الدليل عوامل تصفية الاستبعاد دون الرجوع إلى godoc.org ، وهناك حاجة إلى مزيد من الأمثلة.
للإجابة على بعض أسئلتك بالفعل:
--exclude foo
سيستبعد أي ملفات وأدلة باسم foo
. الشيء نفسه ينطبق على --exclude foo/
.من ملف يستبعد:
._*
سيتطابق مع جميع الملفات والمجلدات التي يبدأ اسمها بنقطة وشرطة سفليةdesktop.ini
سيتطابق تمامًا مع جميع الملفات المسماة desktop.ini
. لذلك لم يتم استبعاد desktop.ini.bak
وحفظها في اللقطة..Trash-*
يستثني الملفات / dirs المسماة .Trash-
، .Trash-foobar
، إلخ..tmp$
جميع الملفات / dirs المسماة حرفياً .tmp$
، وهي نقطة ، متبوعة بـ tmp
، متبوعة بعلامة الدولار. لا يوجد توسيع regexp.~$
جميع الملفات / dirs المسماة حرفياً بالدولار. لاستبعاد جميع الملفات / dirs المنتهية بالتلدة ، استخدم *~
.~/.cache
يستثني الدليل .cache
في كل الدلائل التي تسمى التلدة. لاستبعاد دليل ذاكرة التخزين المؤقت في الدليل الرئيسي الخاص بك فقط ، استخدم $HOME/.cache
(لم يتم توسيع التيلدا ، متغيرات البيئة موجودة ، ولكن فقط في ملف تمت قراءته عبر --exclude-file
، في سطر الأوامر تتوسع shell على حد سواء)./full/path/to/directory/.syncthing/index*
كل الأشياء ذات الأسماء التي تبدأ بـ index
أقل من /full/path/to/directory/.syncthing
.شكرا @ fd0
لذلك مع "الدليل الحالي" ، لا تقصد الدليل الذي كنت فيه عندما قمت بتشغيل النسخة الاحتياطية ، ولكن الدليل الذي رستيتش يقوم حاليًا بفحص الملفات (بصرف النظر عن المستبعدات التي تبدأ بشرطة مائلة). فهمتك.
سلوك الملفات والدلائل غير متوقع إلى حد ما ، كنت أتوقع - exclude foo / لعمل نسخة احتياطية من الدليل ولكن ليس المحتويات ، بينما --exclude foo لإجراء نسخ احتياطي لأي منهما. لست متأكدًا من السبب ، من rsync أعتقد.
لقد فاتني مثال مهم: المساحات! أعتقد أنني بحاجة للهروب من هؤلاء وقصف الحروف الأولية بشرطة مائلة للخلف.
انتهى بي الأمر بنسخ الكثير من هؤلاء: https://gist.github.com/jult/e2eaedad6b9e29d95977fea0ddffae7d
هل التعليقات مسموح بها في ملف الاستثناءات؟ تحرير: https://github.com/restic/restic/pull/916/commits/c796d84fca48feea91ca3e85fbf38e16f764a468 يبدو أن التجزئة هي حرف التعليق.
آه ، أخشى أن هذا ما زال غير صحيح تمامًا. سأصف كيف يقيم restic أنماط الاستبعاد. لنفترض أن restic يديره مستخدم في دليل منزله ( /home/user
) مثل هذا:
$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~
ثم سيشاهد restic وسيطات سطر الأوامر التالية (بعد التوسيع بواسطة shell):
["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]
بعد ذلك ، يبدأ في اجتياز /home/user
. تصف القائمة التالية ما يحدث عند مشاهدة الملف / dir. يختبر restic دائمًا المسار الكامل مقابل الأنماط:
/home/user/foo.bak
: يتطابق النمط *.bak
ولا يتم حفظ الملف. النمط ليس مطلقًا لذا فهو يتطابق في كل مكان لجميع الملفات التي تنتهي بـ .bak
./home/user/secret
: النمط المطلق /home/user/secret
يطابق ، لذلك لا يتم حفظ dir ولا يتم اجتيازه/home/user/foo/home/user/secret
: لا يوجد نمط مطابق لذلك يتم حفظ dir./home/user/work/extra
: النمط extra
يطابق ، لا يتم حفظ dir.آمل أن يكون هذا أوضح قليلاً الآن ، سأضيف قسمًا إلى الدليل يصف العملية. نقطة الاستخراج الرئيسية هي أن الأنماط يتم تقييمها مقابل المسار الكامل للملفات أثناء النسخ الاحتياطي. لذلك إذا كنت تريد مطابقة دليل واحد ، فاستخدم المسار الكامل ، وإلا فقد يتطابق عدة مرات في مكان ما.
أي أسئلة أخرى؟ :)
لدي المزيد من الأسئلة ، وأنا أقدر بشدة الوقت الذي تستغرقه للإجابة عليها. إنه حقًا سؤال واحد حول التثبيت التلقائي للأنماط. أعتقد أنه يمكنني تخمين الإجابة (نعتمد على المسار المطلق لكونه فريدًا إلى حد ما ويعطينا السلوك الذي نريده) ، ولكن من الأفضل أن نسأل ونتأكد.
هل سيتطابق النمط المطلق /home/user/secret
مع /home/user/secret2
؟ (ماذا لو كنت لا تريد ذلك؟)
هل سيتطابق النمط المطلق /home/user/secret
مع /home/user/somemount/home/user/secret
؟
في كلتا الحالتين: لا ، لن يتطابق النمط.
لماذا هذا؟ تحرير: يسعدني أنه لا يحدث ذلك ، لكنني لا أرى سبب ذلك :)
تم تصميم الكود المطابق على غرار ما ستفعله الصدفة: إذا سألت نفسك ، إذا كان الملف /home/user/secret2
موجودًا ، فماذا يمكن طباعة ls /home/user/secret
(قدم الملف secret
غير موجود)؟
بعبارات أكثر رسمية: إذا بدأ النمط بـ /
فهو مطلق ويجب أن يتطابق النمط في بداية السلسلة قيد الاختبار ، لذا فإن النمط /home/user/secret
لا يتطابق مع /home/user/somemount[...]
: النمط ليس بادئة من السلسلة.
يمكنك أن تتخيل بنفسك أن النمط ومسار الملف منقسمان إلى مكونات كل منهما:
/home/user/secret
مقسم إلى [ROOT, "home", "user", "secret"]
والملف /home/user/somemount/home/user/secret
مقسم إلى [ROOT, "home", "user", "somemount", "home", "user", "secret"]
. تم استخدام السلسلة ROOT
في هذا المثال لتمييز الدليل الجذر. يمكنك أن ترى أن النمط غير موجود في اسم الملف./home/user/secret2
، الذي تم تقسيمه إلى [ROOT, "home", "user", "secret2"]
. مرة أخرى يمكنك أن ترى أن النمط غير موجود في اسم الملف./home/user/secret/secret.txt
، المقسم إلى [ROOT, "home", "user", "secret", "secret.txt"]
يمكنك أن ترى أن النمط موجود بالفعل في اسم الملف ، تمامًا في البداية: [ROOT, "home", "user", "secret", ...]
، وبالتالي فإن النمط مطابق ويتم استبعاد الملف.secret/secret.txt
، مقسم إلى ["secret", "secret.txt"]
. يمكنك أن ترى أن هذا النمط يمكن العثور عليه في قائمة الملف /home/user/secret/secret.txt
، بدءًا من الإزاحة 3: [ROOT, "home", "user", "secret", "secret.txt"]
، وبالتالي فإن النمط مطابق.عندما يكون لديك أحرف بدل ( *
، ?
وهكذا) في مكون المسار ، يتم اختبارها أيضًا. لذا بالنسبة للمثال الأول ، فإن النمط /home/user/secret*
سيطابق المسار /home/user/secret2
.
يجب أن تكون كل هذه الأمثلة موثقة في الدليل على ما أعتقد.
مسكتك. شكرا.
هل الاستثناءات السلبية ممكنة علاء .gitignore؟
لنفترض أنني أريد استبعاد جميع المحتويات في الدلائل المسماة .meteor باستثناء dir .meteor / local / db المتداخلة ، فهل يمكنني القيام بذلك؟
/ etc / restic / يستبعد:
.meteor/
!.meteor/local/db
restic backup exclude-file=/etc/restic/excludes
لا ، لم يتم تنفيذ ذلك بعد.
يتم تتبع توثيق أمثلة التضمين / الاستبعاد في # 396 ، وأنا أغلق هذه المشكلة هنا.
@ fd0 أحاول استبعاد مسارات مثل الوظائف التالية / / jobs / / builds / ** / archive لاستبعاد أرشيف dir من جميع الدلائل التي ستعمل. ولدي مسارات متعددة مثل هذا أحتاج إلى استبعادها ، إذا أمكن ، هل يمكنك أن تقترح لي أفضل طريقة للتعامل مع هذا النوع حيث لا يمكنني العثور على أي مثال لهذا النوع في الوثائق
التعليق الأكثر فائدة
للإجابة على بعض أسئلتك بالفعل:
--exclude foo
سيستبعد أي ملفات وأدلة باسمfoo
. الشيء نفسه ينطبق على--exclude foo/
.من ملف يستبعد:
._*
سيتطابق مع جميع الملفات والمجلدات التي يبدأ اسمها بنقطة وشرطة سفليةdesktop.ini
سيتطابق تمامًا مع جميع الملفات المسماةdesktop.ini
. لذلك لم يتم استبعادdesktop.ini.bak
وحفظها في اللقطة..Trash-*
يستثني الملفات / dirs المسماة.Trash-
،.Trash-foobar
، إلخ..tmp$
جميع الملفات / dirs المسماة حرفياً.tmp$
، وهي نقطة ، متبوعة بـtmp
، متبوعة بعلامة الدولار. لا يوجد توسيع regexp.~$
جميع الملفات / dirs المسماة حرفياً بالدولار. لاستبعاد جميع الملفات / dirs المنتهية بالتلدة ، استخدم*~
.~/.cache
يستثني الدليل.cache
في كل الدلائل التي تسمى التلدة. لاستبعاد دليل ذاكرة التخزين المؤقت في الدليل الرئيسي الخاص بك فقط ، استخدم$HOME/.cache
(لم يتم توسيع التيلدا ، متغيرات البيئة موجودة ، ولكن فقط في ملف تمت قراءته عبر--exclude-file
، في سطر الأوامر تتوسع shell على حد سواء)./full/path/to/directory/.syncthing/index*
كل الأشياء ذات الأسماء التي تبدأ بـindex
أقل من/full/path/to/directory/.syncthing
.