Git checkout / pull не видаляє каталоги?


84

У мене є репо @ github. Я зробив якусь роботу вдома і відсунув її до github. Це передбачало деяке видалення файлів та каталогів. Зараз я перебуваю у своєму робочому вікні, в якому була копія коду перед видаленням файлів та каталогів.

Я видав таке:

git remote update
git checkout HEAD
git pull origin HEAD

Він видалив усі файли, які повинен був мати, але не каталоги, в яких вони знаходились.

Два питання:

  1. Чому він не видалив каталоги?
  2. Чи є команда git, яку я можу надати в поточному стані, щоб видалити їх?

Погоджено, git checkout HEAD нічого не робить, оскільки HEAD - це посилання, що вказує на поточний зареєстрований коміт. Ви, ймовірно, йшли на майстра в обох випадках.
Cascabel

Ну, HEAD насправді оновив все, за винятком видалення порожніх каталогів. Як я вже сказав, я новачок у git.
mculp

Можливий дублікат Як змусити "git pull" перезаписати локальні файли? Будь ласка, перевірте відповіді там, якщо ви все ще хочете отримати різні рішення.
DrBeco

Відповіді:


153

Git не відстежує каталоги, тому не видаляє каталоги, які порожні в результаті об'єднання або інших змін. Тим НЕ менше, ви можете використовувати git clean -fdдля видалення неотслежіваемих каталогів (на -fdкошти прапора F видалення Орса з неотслежіваемих файлів і д irectories).


4
Я збентежений. Тоді чому каталоги видалялися з мого репозитарію GitHub, коли я фіксував / натискав зміни?
mculp

1
Каталоги у вашій робочій копії могли містити файли, що не відслідковуються (включаючи приховані файли, що не відслідковуються), і, отже, вони можуть здаватися порожніми, але насправді не є, тому Git їх не видалив. git cleanбуде, звичайно.
mipadi

4
Це може бути пов’язано з тим, що репозиторії GitHub - це голі сховища (у них немає робочих копій), але у вашого локального. Я думаю, якби ви клонували нове репо з походження GitHub, у вас не було б цих каталогів.
mipadi

18
Але, звичайно, виконайте команду з -n(сухий запуск) замість -fспочатку, щоб ви могли побачити, що буде видалено. Тим паче, що git clean -dвидаляє не лише ті цікаві каталоги, а й невідстежувані файли.
Тодд Оуен,

2
@EliGolin: git cleanне видаляє файли, перелічені в .gitignore, якщо ви не перейдете до цієї -xопції.
міпаді

4

Як частина більшості операцій, що змінюють робоче дерево (витягування, об’єднання, оформлення замовлення тощо), git видалить усі каталоги, які порожні в результаті цієї операції (тобто git видалив останній файл).

git не видалить будь-які каталоги, які не є повністю порожніми, тому, якщо у вас є приховані або проігноровані файли, то те, що git видаляє останній відстежуваний файл із цього каталогу, не обов'язково означає, що git зможе видалити цей каталог. git не вважає це станом помилки, тому не буде скаржитися на це.


У моєму репозиторії GitHub немає каталогів. Коли я зафіксував, він правильно видалив каталоги. Однак, коли я оформляю замовлення / тягну, він видаляє лише файли. Каталоги порожні. $ ls -al загалом 8 drwxr-xr-x 2 mculp mculp 4096 23 вересня 15:43. / drwxr-xr-x 8 mculp mculp 4096 30 вересня 10:51 ../
mculp

1
Я не зовсім впевнений, що ви маєте на увазі під "переключив HEAD на master", я припускаю, ви маєте на увазі " git checkout master", але більшість людей просто скажуть "я перейшов на / перевірив master". У будь-якому випадку, коли git сказав "Вже оновлений". це означає, що він нічого не зробив. git буде видаляти лише каталоги, які він робить порожніми.
CB Bailey

Погане формулювання. Я змінив "HEAD" на "master", як деякі люди пропонували в коментарях.
mculp

@CharlesBailey, те, що ти сказав, не те, що я бачу. git checkoutне видалив повністю порожній каталог.
Проникність

@ABB: Git видаляє тільки каталоги, зроблені порожній операцією перевірки. Я перевірив це ще раз; це все ще працює.
CB Bailey

3

У мене була та ж проблема, у моєму випадку щодо служби збірки (CI) .. оскільки GIT витягує всі файли без очищення папок, усі bin / obj, які раніше були побудовані CI, забруднені, тому якщо я видалю тестовий проект, bin як і раніше міститиме DLL і буде згадувати тести, яких не існує.

З метою вирішення цього питання; здається, ця команда робить фокус (принаймні для мене)

git clean -fd -x

де X видалить усі файли, що не відслідковуються:

-X Видалити лише файли, проігноровані Git. Це може бути корисно для відновлення всього з нуля, але зберігайте створені вручну файли.


2

Git не відстежує каталоги, файли (з їхнім шляхом). Git створює всі каталоги для цих шляхів, якщо вони ще не існують (круто!), Однак не видаляє їх, якщо всі файли, що містяться в шляху, переміщуються або видаляються (не круто ☹ ... але є причини).

Рішення (після витягування / перемотування вперед / об'єднання):

git stash --include-untracked
git clean -fd
git stash pop

Якщо ви цього не зробите stashраніше clean, ви втратите всі свої файли, що не відстежуються (безповоротно).

Примітка: оскільки це також очищає всі проігноровані файли, можливо, вам доведеться запустити деякі сценарії збірки ще раз, щоб відтворити метадані проекту (наприклад:) ./gradlew eclipse. Це також видаляє пусті каталоги, які ніколи не були частиною шляхів до файлів git.


-1

Наразі Git не відстежує каталоги (див. Git wiki ), тобто ви не можете додавати порожні каталоги, ані git видаляти каталоги, які закінчуються порожніми. (EDIT: Дякую, Манні, я помилився! Ви не можете додати порожні каталоги, але git видалить каталоги, які стануть порожніми, оскільки їх відстежуваний вміст було видалено. )

Щодо команди на видалення порожніх каталогів: це залежить від вашої операційної системи.

Для Linux ви можете використовувати, наприклад,

find -depth -type d -empty -exec rmdir {} \;

Однак це видалить усі порожні каталоги!


1
Сторінка wiki говорить, що git не створює для вас порожніх каталогів. Це не означає, що він не буде видаляти порожні каталоги. Те, що хоче mculp, працює для мене.
innaM

@janko, Насправді, git не вдалося видалити для мене абсолютно порожній каталог.
Проникність
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.