українська мова ▾ Topics ▾ Latest version ▾ git-rm last updated in 2.50.0

НАЗВА

git-rm  — Видалення файлів з робочого дерева та з індексу

СИНОПСИС

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
       [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
       [--] [<pathspec>…​]

ОПИС

Використовується для видалення файлів, що відповідають специфікатору шляху (pathspec), з індексу або з робочого дерева та індексу. git rm видаляє файл не лише з вашої робочої теки. (Немає можливості видалити файл лише з робочого дерева, але зберегти його в індексі; використовуйте /bin/rm, якщо хочете це зробити.) Файли, що видаляються, мають бути ідентичними вершині гілки, і жодні оновлення їхнього вмісту не можуть бути поміщені в індекс, хоча цю типову поведінку можна змінити за допомогою опції -f. Коли вказано --cached, вміст в stage має відповідати або вершині гілки, або файлу на диску, що дозволяє видалити файл лише з індексу. Коли використовуються розріджені перевірки (див. git-sparse-checkout[1]), git rm видалятиме лише шляхи в межах шаблонів розріджених перевірок.

ОПЦІЇ

<pathspec>...

Файли для видалення. Можна вказати назву теки (наприклад, dir для видалення dir/file1 та dir/file2) для видалення всіх файлів у теці та рекурсивно всіх підтеках, але для цього потрібно явно вказати опцію -r.

Команда видаляє лише ті шляхи, які відомі Git.

Використання символів підстановки діє й за межами теки. Таким чином, враховуючи те що нас є дві теки d та d2, є різниця між використанням git rm d*' та git rm d/*', оскільки перше також видалить всю теку d2.

Для отримання додаткової інформації див. опис <pathspec> у gitglossary[7].

-f
--force

Перевизначає перевірки актуальності.

-n
--dry-run

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

-r

Дозволяє рекурсивне видалення, якщо вказано назву теки.

--

Цей параметр можна використовувати для відокремлення параметрів командного рядка від списку файлів (корисно, коли імена файлів можуть бути сплутані з параметрами командного рядка).

--cached

Використовуйте цю опцію, щоб видалити лише шляхи з індексу. Файли в робочому дереві, змінені чи ні, залишаться без змін.

--ignore-unmatch

Завершує роботу з нульовим статусом, навіть якщо не знайдено жодного файлу.

--sparse

Дозволяє оновлення записів індексу поза межами конуса розрідженого контролю. Зазвичай, git rm відмовляється оновлювати записи індексу, шляхи яких не вписуються в конус розрідженого контролю. Див. git-sparse-checkout[1] для отримання додаткової інформації.

-q
--quiet

git rm зазвичай виводить один рядок (у формі команди rm) для кожного видаленого файлу. Ця опція пригнічує цей вивід.

--pathspec-from-file=<файл>

Специфікація шляху передається у <файл> замість аргументів. Якщо значення <файл> дорівнює -, то використовується стандартний ввід. Елементи специфікатора шляхів розділяються символами LF або CR/LF. Елементи специфікатора шляхів можна брати в лапки, як це пояснено для змінної конфігурації core.quotePath (див. git-config[1]). Див. також --pathspec-file-nul та глобальну змінну --literal-pathspecs.

--pathspec-file-nul

Має сенс лише з --pathspec-from-file. Елементи Pathspec розділяються символом NUL, а всі інші символи (включно з символами нового рядка та лапками) сприймаються буквально.

ВИДАЛЕННЯ ФАЙЛІВ, ЯКІ ЗНИКЛИ З ФАЙЛОВОЇ СИСТЕМИ

Команда git rm не має можливості видаляти з індексу лише ті шляхи, які зникли з файлової системи. Однак, залежно від випадку використання, існує кілька способів зробити це.

Використання “git commit -a”

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

Використання “git add -A”

Під час акцептування нового коду для гілки постачальника, ймовірно, ви захочете записати як видалення шляхів, так і додавання нових шляхів, а також зміни наявних шляхів.

Зазвичай спочатку потрібно видалити всі відстежувані файли з робочого дерева за допомогою цієї команди:

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

а потім розпакувати новий код у робочому дереві. Або ж ви можете зробити «rsync» змін в робочому дереві.

Після цього найпростіший спосіб записувати всі видалення, додавання та модифікації в робочому дереві це:

git add -A

Див. git-add[1].

Інші способи

Якщо все, що ви насправді хочете зробити, це видалити з індексу файли, яких більше немає в робочому дереві (можливо, тому, що ваше робоче дерево "брудне", тому ви не можете використовувати git commit -a), скористайтеся такою командою:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

СУБМОДУЛІ

Тільки субмодулі, що використовують gitfile (це означає, що вони були клоновані за допомогою Git версії 1.7.8 або новішої), будуть видалені з робочого дерева, оскільки їхній репозиторій знаходиться в теці .git суперпроєкту. Якщо субмодуль (або один з вкладених у нього) все ще використовує теку .git, git rm переміщує теку submodules git до теки superprojects git, щоб захистити історію субмодуля. Якщо вона існує, розділ submodule.<name> у файлі gitmodules[5] також буде видалено, і цей файл буде поміщено в stage (якщо не використовується --cached або -n).

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

Якщо ви хочете лише видалити локальне отримання субмодуля з вашого робочого дерева без фіксації видалення, використовуйте замість цього git-submodule[1] deinit. Також дивіться gitsubmodules[7] для отримання детальної інформації про видалення субмодулів.

ПРИКЛАДИ

git rm Documentation/\*.txt

Видаляє всі файли *.txt з індексу, що знаходяться в теці Documentation та будь-яких її підтеках.

Зверніть увагу, що зірочку * у цьому прикладі екрановано з боку оболонки; це дозволяє Git, а не оболонці, розширювати шляхи до файлів та підтек у Documentation/.

git rm -f git-*.sh

Оскільки цей приклад дозволяє командній оболонці інтерпретувати зірочку (тобто ви явно перераховуєте файли), він не видаляє subdir/git-foo.sh.

ПОМИЛКИ

Кожного разу, коли оновлення суперпроєкту видаляє заповнений субмодуль (наприклад, при перемиканні між комітами до і після видалення), в старому місці залишатиметься застаріла копія субмодуля. Видалення старої теки безпечно лише тоді, коли вона використовує gitfile, оскільки в іншому випадку буде видалена вся історія субмодуля. Цей крок стане неактуальним, коли буде реалізовано рекурсивне оновлення субмодулів.

ДИВ. ТАКОЖ

GIT

Частина набору git[1]