2016-06-02 4 views
0

Мне интересно, можно ли удалять файлы определенных расширений после их добавления в Git tracking.Удалить файлы определенного расширения из Git Tracking After Staging

В частности, у меня есть .gitignore, который уже устраняет эти файлы. Однако в результате неудачи они, возможно, были добавлены к отслеживанию. Теперь мой план - запустить и запустить git rm --cached во всех каталогах и файлах, указанных в .gitignore. Но я затрудняюсь рассматривать записи, указанные как расширения файлов.

+0

это получает список недавно добавленных файлов, которые находятся в индексе «мерзавец дифференциала - -cached --diff-filter = A -name-only. Это может помочь, если неудача добавила посторонние файлы, а намеренная фиксация - нет. В противном случае git rm --cached - * .xxx должен удалить файл из индекса в соответствии с моим чтением git help rm – Gregg

+0

Будет ли git rm --cached - * .xxx делать это для всех файлов и всех (под) каталогов? – MadPhysicist

ответ

2

Я хотел бы использовать find для этого, так как она позволяет как задать шаблон имени файла (включая .extension) и выполнить команду на этом файле.

Вот пример, который делает процедуру вручную, для одного расширения файла одновременно (? Т.е. вновь отслеживаться)

/tmp/madphys $ git init . 
Initialized empty Git repository in /tmp/madphys/.git/ 
/tmp/madphys HEAD$ touch lala.a 
/tmp/madphys HEAD$ touch lala.b 
/tmp/madphys HEAD$ mkdir dirdir 
/tmp/madphys HEAD$ touch dirdir/bobo.a 
/tmp/madphys HEAD$ git add . 
/tmp/madphys HEAD$ git commit -m first 
[master (root-commit) bfc10f1] first 
3 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 dirdir/bobo.a 
create mode 100644 lala.a 
create mode 100644 lala.b 
/tmp/madphys master$ echo "*.a" > .gitignore 
/tmp/madphys master$ git add -A . 
/tmp/madphys master$ git commit -m ignore 
[master 3e0d206] ignore 
1 file changed, 1 insertion(+) 
create mode 100644 .gitignore 
/tmp/madphys master$ find . -name "*.a" -type f -exec git rm --cached {} \; 
rm 'dirdir/bobo.a' 
rm 'lala.a' 
/tmp/madphys master$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    deleted: dirdir/bobo.a 
    deleted: lala.a 

/tmp/madphys master$ git commit -m "removed" 
[master 87d95d6] removed 
2 files changed, 0 insertions(+), 0 deletions(-) 
delete mode 100644 dirdir/bobo.a 
delete mode 100644 lala.a 
/tmp/madphys master$ tree 
. 
├── dirdir 
│   └── bobo.a 
├── lala.a 
└── lala.b 

1 directory, 3 files 
/tmp/madphys master$ git status 
On branch master 
nothing to commit, working directory clean 
+0

Спасибо за подробный учебник! Когда я последую за ним, после того, как я удалю bobo.a и lala.a и запустил «git status», мой говорит: «Изменения не поставлены для фиксации», а не «Изменения, которые необходимо совершить». Я делаю что-то по-другому? – MadPhysicist

+0

На самом деле, я думаю, что пропустил одну из команд, поэтому я буду повторять ее. – MadPhysicist

+0

Как раз пояснить, существует ли принципиальное различие между «git rm» и «rm»? – MadPhysicist