سؤال

أريد أن استخدام شيء مثل الأمر التالي لإنشاء كتل القطران لنشر:

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

الداخلية git diff الأوامر تنتج قائمة من الملفات مع النسبية بما في ذلك المسار النسبي عند تشغيلها بشكل منفصل.

أنا على التوالي في مشكلتين على الرغم من أنني يجب أن تكون قادرة على السيارات الهروب المساحات في الإخراج ، حتى القطران لا يشكو من الملفات التي تحتوي على مسافات وعندما القطران لا تحصل على خلق كل الملفات مكررة 'الملفات المخفية' سبق '.' التي لا تظهر مع ls-al.هذه هي OSX محددة التعريف كما أشار kch.

على أي حال, لا أحد يعرف من حل هذه المشاكل أم أن هناك فقط سهل أسهل طريقة السيناريو هذا ؟

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

المحلول

وأنا استقر على الحل التالي مع الحزب الاشتراكي الموحد.

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

نصائح أخرى

ووملفات نقطة خفية، هم دوت ملفات تسطير؟

إذا لfoo ملف لديك ._foo آخر، وكنت على ماك، الملف دوت تسطير حيث يتم الاحتفاظ الموارد ملف شوكة / الفوقية.

وأما بالنسبة للانتاج بوابة، قد تحاول الأنابيب من خلال sed أو perl نقلا عن. أعتقد xargs يمكن أن تساعد هنا أيضا.

لماذا لا تستخدم --files-from=FILE أو -T FILE الخيار من القطران، حيث يمكن أن يكون FILE '-' للدلالة على الإدخال القياسي

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

ويجب أن لا يكون مشكلة مع مسافات أو علامات التبويب في أسماء الملفات، أو مع علامات الاقتباس المفردة، أو backquotes، أو الخطوط المائلة العكسية (أعتقد أن الحل لديهم مشاكل مع اقتباس مفردة "" في اسم الملف). قد يكون لديك مشكلة مع أسطر جديدة في أسماء الملفات، مثلما هو الحال في حل IFS.

إذا كان الحجم لا يهم هل يمكن استخدام بوابة الأرشيف.

أنا لست متأكدا مما إذا كان من الممكن إنشاء كتل القطران التي تحتوي فقط على الخلافات بين اثنين من يرتكب.

ويمكنك محاولة

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

وأو محاولة نفس الشيء باستخدام الحوار الاقتصادي الاستراتيجي، أو

IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

ملاحظة أنه لا يوجد سوى سطر جديد واحد في IFS.

ولكن، إذا كان اسم الملفات تحتوي على أسطر جديدة، وأنت محكوم.

وهنا، حل أكثر أناقة آخر يعمل في جميع أنحاء الهروب المسافات في أسماء

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

وكما أشار jpalecek بها، القفر واحدة لا تريد لتشغيل "القطران -c ..." عدة مرات، من الأفضل أن تستخدم -r.

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