إزالة ملفات متعددة من Git repo والتي تم حذفها بالفعل من القرص

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

سؤال

لدي Git repo وقد قمت بحذف أربعة ملفات من استخدامها rm (لا git rm)، وتبدو حالة Git الخاصة بي كما يلي:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

كيف يمكنني إزالة هذه الملفات من Git دون الحاجة إلى مراجعة كل ملف وإضافته يدويًا مثل هذا:

git rm file1 file2 file3 file4

من الناحية المثالية، أنا أبحث عن شيء يعمل بنفس الطريقة git add . يفعل، إذا كان ذلك ممكنا.

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

المحلول

لجيت 1.x

$ git add -u

يُخبر هذا git بتنظيم الملفات المتعقبة تلقائيًا - بما في ذلك حذف الملفات المتعقبة مسبقًا.

لجيت 2.0

لعرض شجرة العمل بأكملها:

$ git add -u :/

لعرض المسار الحالي فقط:

$ git add -u .

نصائح أخرى

git ls-files --deleted -z | xargs -0 git rm 

قد يكون ما تبحث عنه..يعمل بالنسبة لي ..

يمكنك استخدام

git add -u

لإضافة الملفات المحذوفة إلى منطقة التدريج، قم بإرفاقها

git commit -m "Deleted files manually"

إذا قمت ببساطة بتشغيل:

git add -u

سيقوم git بتحديث فهرسه لمعرفة أن الملفات التي قمت بحذفها يجب أن تكون في الواقع جزءًا من الالتزام التالي.ثم يمكنك تشغيل "git Commit" للتحقق من هذا التغيير.

أو إذا قمت بتشغيل:

git commit -a

سوف يأخذ هذه التغييرات (وأي تغييرات أخرى) تلقائيًا ويلتزم بها.

تحديث:إذا كنت تريد إضافة الملفات المحذوفة فقط، فجرب:

git ls-files --deleted -z | xargs -0 git rm
git commit

ربما كنت تبحث عن -A:

git add -A

وهذا مشابه لـ git add -u، ولكنه يضيف أيضًا ملفات جديدة.وهذا يعادل تقريبًا نسبة الزئبق addremove الأمر (على الرغم من أن اكتشاف الحركة يكون تلقائيًا).

لاستضافة المحذوفة فقط الملفات:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

أو (طريقة xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

أنت تستطيع الاسم المستعار مجموعة الأوامر المفضلة لديك لاستخدامها لاحقًا بشكل مريح.

git rm test.txt

قبل أو بعد حذف الملف الفعلي.

باستخدام git-add مع خيارات '--all' أو '--update'، قد تحصل على أكثر مما تريد.سيتم أيضًا إضافة ملفات جديدة و/أو معدلة إلى الفهرس.لدي إعداد bash alias عندما أرغب في إزالة الملفات المحذوفة من git دون لمس الملفات الأخرى:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

تتم إضافة جميع الملفات التي تمت إزالتها من نظام الملفات إلى الفهرس على أنها محذوفة.

ليس هذا مهمًا حقًا، لكنني لا أتفق مع الإجابة المختارة:

git add -u 

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

git rm $(git ls-files --deleted)

...ومن ناحية أخرى سوف يقوم فقط بإعادة الملفات المحذوفة التي تم تعقبها.

وبالتالي فإن الخيار الأخير في نظري هو الخيار الأفضل.

إذا كانت هذه هي التغييرات الوحيدة، فيمكنك القيام بذلك ببساطة

git commit -a

لارتكاب كافة التغييرات.وسيشمل ذلك الملفات المحذوفة.

git ls-files --deleted | xargs git rm 

هو الخيار الأفضل لإضافة الملفات المحذوفة فقط.

وهنا بعض الخيارات الأخرى.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

بوابة إضافة -u

-u -uddate يتطابق فقط مع الملفات التي تم تعقبها بالفعل في الفهرس بدلاً من شجرة العمل.وهذا يعني أنه لن يقوم أبدًا بتجهيز ملفات جديدة، ولكنه سيقوم بتجهيز محتويات جديدة معدلة للملفات المتعقبة وأنه سيزيل الملفات من الفهرس إذا تمت إزالة الملفات المقابلة في شجرة العمل.

إذا لم يتم تحديد "لا"، الافتراضي هو ".";بمعنى آخر، قم بتحديث جميع الملفات المتعقبة في الدليل الحالي وأدلته الفرعية.

هذا الحل البسيط يعمل بشكل جيد بالنسبة لي:

git rm $(git ls-files --deleted)

إذا كنت ترغب في إضافته إلى الخاص بك .gitconfig افعل هذا:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

ثم كل ما عليك فعله هو تشغيل:

git rma
git ls-files --deleted -z | xargs -0 git rm --cached

سيؤدي هذا إلى إزالة جميع الملفات المحذوفة التي تم تتبعها مسبقًا بواسطة git، بالإضافة إلى التعامل مع الحالة التي تحتوي فيها أسماء الملفات الخاصة بك على مسافات.

اعتمادًا على متغير POSIX الخاص بك، قد تحتاج إلى استخدامه xargs -0 -r:هذا سوف يسبب xargs للخروج بأمان عند إرسال محتوى فارغ.

يحرر: --cached و --deleted يتم استخدام العلامات جنبًا إلى جنب للحماية من الحذف غير المقصود للملفات التي لم يتم حذفها بالفعل.

جربها.

-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.

git add . && git commit -m -a "Your commit"

أو

git add --all && git commit -m "Your commit"

الرجاء استخدام -t لمعرفة الأمر الذي يتم تشغيله بالفعل

لقد قمت للتو بتعديل إجابة Virender لفعل الشيء نفسه:

git ls-files --deleted -z | xargs -t -0 git rm

لن تؤدي أي من العلامات إلى git-add إلى عرض الملفات المحذوفة فقط؛إذا كان كل ما قمت بتعديله عبارة عن ملفات محذوفة، فلا بأس، ولكن بخلاف ذلك، ستحتاج إلى تشغيل git-status وتحليل الإخراج.

من خلال العمل على إجابة جيريمي، هذا ما حصلت عليه:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. الحصول على حالة الملفات.
  2. بالنسبة للملفات المحذوفة، قم بعزل اسم الملف.
  3. قم بإزالة جميع الأسطر التي تبدأ بـ #s، بالإضافة إلى سطر الحالة الذي يحتوي على كلمة "محذوف"؛لا أتذكر ما هو بالضبط، ولم يعد موجودًا بعد الآن، لذا قد تضطر إلى تعديل هذا لمواقف مختلفة.أعتقد أن تجميع التعبيرات قد يكون ميزة خاصة بـ GNU، لذلك إذا كنت لا تستخدم nutils، فقد تضطر إلى إضافة عدة تعبيرات grep -v خطوط.
  4. قم بتمرير الملفات إلى git rm.

لصق هذا في الاسم المستعار لـ Shell الآن ...

كما ذكر

git add -u

مراحل الملفات التي تمت إزالتها للحذف، ولكن أيضًا الملفات المعدلة للتحديث.

لإلغاء تنظيم الملفات المعدلة يمكنك القيام به

git reset HEAD <path>

إذا كنت ترغب في الحفاظ على التزاماتك منظمة ونظيفة.
ملحوظة: قد يؤدي هذا أيضًا إلى إلغاء تنظيم الملفات المحذوفة، لذا كن حذرًا مع أحرف البدل تلك.

سيعمل ما يلي، حتى لو كان لديك الكثير من الملفات التي تحتاج إلى معالجتها:

git ls-files --deleted | xargs git rm

ربما تريد أيضًا الالتزام بالتعليق.

لمزيد من التفاصيل، راجع: مخطوطات جيت مفيدة

git commit -m 'commit msg' $(git ls-files --deleted)

نجح هذا بالنسبة لي بعد أن قمت بالفعل بحذف الملفات.

كنت بحاجة إلى نفس الشيء واستخدمت زر GIT GUI "تم تغيير المرحلة".كما يضيف كل شيء.

وبعد "تغير المرحلة" عملت "التزم"...

لذلك أصبح دليل العمل الخاص بي نظيفًا مرة أخرى.

يمكنك استخدام git add -u <filenames> لعرض الملفات المحذوفة فقط.

على سبيل المثال، إذا قمت بحذف الملفات templates/*.tpl, ، ثم استخدام git add -u templates/*.tpl.

ال -u مطلوب للإشارة إلى الملفات الموجودة في المستودع ولكنها لم تعد موجودة في دليل العمل.وإلا فإن الوضع الافتراضي git add هو البحث عن الملفات في دليل العمل، وإذا قمت بتحديد الملفات التي قمت بحذفها هناك، فلن يجدها.

شيء مثل

git status | sed -s "s/^.*deleted: //" | xargs git rm 

قد تفعل ذلك.

إضافة اسم مستعار للنظام لتنظيم الملفات المحذوفة كأمر rm-all

يونيكسalias rm-all='git rm $(git ls-files --deleted)'

شبابيكdoskey rm-all=bash -c "git rm $(git ls-files --deleted)"

ملحوظة

يحتاج ويندوز إلى أن يكون bash المثبتة.

(اختلاف آخر)

كنت أرغب في حذف جميع الملفات المحذوفة بالفعل من ملفات القرص ولكن من مجلد واحد محدد، مع ترك المجلدات الأخرى دون تغيير.ما يلي عملت بالنسبة لي:

git ls-files --deleted  | grep <folder-name> | xargs git rm
git rm $(git ls-files -d)

يزيل كافة الملفات المدرجة بواسطة git ls-files الأمر (-d يعرض الملفات المحذوفة فقط).لا يعمل هذا مع الملفات التي تحتوي على مسافات في اسم الملف أو المسار، ولكنه سهل التذكر

لمشروع الاستوديو البصري

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

وهو أمر مفيد عندما يكون مسار الملف المحذوف به مساحة

الحل الأكثر مرونة الذي وجدته حتى الآن هو

git cola

وحدد جميع الملفات المحذوفة التي أريد تنظيمها.

(لاحظ أنني عادةً ما أفعل كل شيء في سطر الأوامر في git، لكن معالجة git لإزالة الملفات أمر محرج بعض الشيء).

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