Удалить файлы из gitignore
есть файл, который отслеживается git , но теперь файл находится на .gitignore список.
однако этот файл продолжает отображаться в git status после редактирования. Как вы заставляете git чтобы совсем забыть об этом?
.gitignore позволит предотвратить неотслеживаемые файлы могут быть добавлены (без add -f ) к набору файлов, отслеживаемых git, однако git будет продолжать отслеживать любые файлы, которые уже отслеживаются.
чтобы остановить отслеживание файла, необходимо удалить его из индекса. Это может быть достигнуто с помощью этой команды.
удаление файла из Главной редакции произойдет при следующем коммите.
серия команд ниже удалит все элементы из индекса Git (не из рабочего каталога или локального РЕПО), а затем обновит индекс Git, соблюдая при этом git игнорирует. PS. Index = Cache
первый:
затем:
Это принимает список игнорируемых файлов и удаляет их из индекса, а затем вносятся изменения.
Я всегда использую эту команду, чтобы удалить эти неотслеживаемые файлы. Однострочный, Unix-стиль, чистый вывод:
он перечисляет все ваши игнорируемые файлы, заменяет каждую выходную строку на строку в кавычках вместо того, чтобы обрабатывать пути с пробелами внутри, и передает все в git rm -r --cached чтобы удалить пути / файлы / dirs из индекса.
- ваш приложения для игнорируемых файлов конфигурации-высшую.ini и использовать более совершенные файл config.ini (или поочередно, ищите~/.config / myapp.ini, или $MYCONFIGFILE)
- Commit file config-sample.ini и игнорировать файл config.ini, есть скрипт или аналогичная копия файла по мере необходимости, если это необходимо.
- попробуйте использовать gitattributes clean/smudge magic, чтобы применить и удалить изменения для вас, например смазать файл конфигурации в качестве проверки из альтернативной ветви и очистить файл конфигурации как проверка от головы. Это сложный материал, я не рекомендую его для начинающего пользователя.
- сохраните файл конфигурации в ветке развертывания, выделенной для него, которая никогда не объединяется с master. Когда вы хотите развернуть / скомпилировать / протестировать, вы сливаетесь с этой ветвью и получаете этот файл. Это, по сути, грязный / чистый подход, за исключением использования политик слияния людей и дополнительных модулей git.
- Anti-recommentation: не используйте assume-unchanged, это закончится только слезами.
переместить его, зафиксировать, а затем переместить его обратно. Это работало для меня в прошлом. Вероятно, есть более "хитрый" способ добиться этого.
что не сработало для меня
поэтому я предлагаю
использует до ls-files и
Я сделал это с помощью git filter-branch. Точная команда, которую я использовал, была взята из man-страницы:
предупреждение: это приведет к удалению файла из всей вашей истории
эта команда воссоздаст всю историю фиксации, выполнив git rm перед каждой фиксацией и так избавится от указанного файла. Не забудьте создать резервную копию перед запуском команды как это будет будут потеряны.
допустим, вы уже добавили/зафиксировали некоторые файлы в свой репозиторий git, а затем добавили их в свой .гитюдного; эти файлы будут по-прежнему присутствовать в ваш индекс репозитория. В этой статье мы увидим, как от них избавиться.
Шаг 1: зафиксируйте все ваши изменения
прежде чем продолжить, убедитесь, что все ваши изменения зафиксированы, включая ваши .файла.gitignore
Шаг 2: Удалите все из репозитория
чтобы очистить РЕПО, используйте:
- rm это команда удалить
- - r позволит рекурсивный удаление
- - cached будут удалены только файлы из индекса. Ваши файлы все еще будут там.
The rm команда может быть неумолимой. Если вы хотите попробовать то, что он делает заранее, добавить -n или --dry-run флаг, чтобы проверить вещи.
Шаг 3: Re добавить все
Шаг 4: Commit
ваш репозиторий чистые :)
нажмите изменения на пульте дистанционного управления, чтобы увидеть изменения действуют и там.
обновить .gitignore file-например, добавьте папку, которую вы не хотите отслеживать в .gitignore .
git rm -r --cached . - удалить все отслеживаемые файлы, в том числе разыскиваемые и нежелательные. Ваш код будет в безопасности, пока вы сохранили локально.
git add . – все файлы будут добавлены обратно, за исключением .gitignore .
Я думаю, что, возможно, git не может полностью забыть о файле из-за его концепции (раздел "снимки, а не различия").
эта проблема отсутствует, например, при использовании CVS. CVS хранит информацию в виде списка изменений на основе файлов. Информация для CVS представляет собой набор файлов и изменений, внесенных в каждый файл с течением времени.
но в Git каждый раз, когда вы совершаете или сохраняете состояние своего проекта, он в основном делает снимок того, что все ваши файлы выглядеть в этот момент и сохраняет ссылку на этот снимок. Поэтому, если вы добавили файл один раз, он всегда будет присутствовать в этом снимке.
эти 2 статьи были полезны для меня:
git предположим-без изменений против skip-worktree и как игнорировать изменения в отслеживаемых файлах с Git
исходя из этого я делаю следующее, если файл уже отслеживается:
от в этот момент все локальные изменения в этом файле будут проигнорированы и не перейдут на удаленный. Если файл изменяется на удаленном, конфликт произойдет, когда git pull . Тайник не сработает. Чтобы решить ее, скопируйте содержимое файла в безопасное место и выполните следующие действия:
содержимое файла будет заменено удаленным содержимым. Вставьте изменения из безопасного места в файл и выполните еще раз:
если все, кто работает с проектом, будет выполнять git update-index --skip-worktree , проблемы с pull должен отсутствовать. Это решение подходит для файлов конфигураций, когда каждый разработчик имеет свою собственную конфигурацию проекта.
это не очень удобно делать каждый раз, когда файл был изменен на удаленном, но может защитить его от перезаписи удаленным контентом.
переместить или скопировать файл в безопасном месте, так что вы не потеряете его. Затем git rm файл и фиксация. Файл по-прежнему будет отображаться, если вы вернетесь к одному из этих предыдущих коммитов или другой ветви, где он не был удален. Однако во всех последующих коммитах вы больше не увидите этот файл. Если файл находится в Git ignore, вы можете переместить его обратно в папку, и git не увидит его.
ответ от Мэтта страха был самым эффективным ИМХО. Ниже приведен только сценарий PowerShell для тех, кто в windows, чтобы удалить только файлы из своего репозитория git, который соответствует их списку исключений.
Если вы не хотите использовать CLI и работаете в Windows, очень простое решение-использовать TortoiseGit, Он имеет действие "удалить (сохранить локальный)" в меню, которое отлично работает.
I have some files in my repository that should be ignored, i added them to the .gitignore but, of course, they are not removed from my repository.
So my question is, is there a magic command or script using filter-branch that can rewrite my history and remove all these files easily? Or simply a command that will create a commit that will remove them ?
WARNING: While this will not remove the physical file from your local, it will remove the files from other developers machines on next git pull. How to make Git “forget” about a file that was tracked but is now in .gitignore?
@Stevoisiak this is not a duplicate of that question because this one asks about ALL ignored files and it also has a better answer than any of the similar questions.
9 Answers 9
You can remove them from the repository manually:
Or, if you have a lot of files:
But this doesn't seem to work in Git Bash on Windows. It produces an error message. The following works better:
In PowerShell on Windows this works even better (handles spaces in path and filenames):
Regarding rewriting the whole history without these files, I highly doubt there's an automatic way to do it.
And we all know that rewriting the history is bad, don't we? :)
@NateBundy if you're referring to the fact that xargs won't work with spaces, most command line utilities get around that by using special flags so that whitespace won't matter. Off the top of my head I don't remember what the flags are for git ls-files and xargs (I think it might be -0 for xargs ), but you can look them up.
"git ls-files -i --exclude-from=.gitignore" is very helpful, it tells me what files are excluded by .ignore.
I was happy to find these commands, BUT it does not really remove the files from repository. When i removed 2300 kB of images, repository size dropped only 10 kB. So it cannot be used, for example, to make repository smaller and faster to transfer.
Note that regardless of your current directory, --exclude-from= is relative to the git root. So if you want to do this for a .gitignore in a subdirectory, use --exclude-from=[subdirectory]/.gitignore .
An easier way that works regardless of the OS is to do
You basically remove and re-add all files, but git add will ignore the ones in .gitignore .
Using the --cached option will keep files in your filesystem, so you won't be removing files from your disk.
Note: Some pointed out in the comments that you will lose the history of all your files. I tested this with git 2.27.0 on MacOS and it is not the case. If you want to check what is happening, check your git diff HEAD~1 before you push your commit.
How does this effect other users on the repo executing a pull - as I read it the folder we dont want to track anymore is deleted. How can we prevent this - we just want to untrack
what do you mean by fake commit message? It's a real commit message :P You can change the message of course, depending on your needs.
Just to clarify a bit because the git status after doing git rm -r --cached . git add . can look a bit scary: These three commands that @gtatr provides essentially delete files from git that were previously tracked, but have since been added to your .gitignore file. When I first ran this, I saw a bunch of files and freaked out for a second but upon further inspection I noticed they were all files that were listed in my .gitignore file.
As the files in .gitignore are not being tracked, you can use the git clean command to recursively remove files that are not under version control.
Use git clean -xdn to perform a dry run and see what will be removed.
Then use git clean -xdf to execute it.
Basically, git clean -h or man git-clean (in unix) will give you help.
Be aware that this command will also remove new files that are not in the staging area.
This should be the accepted answer. It actually works (the accepted answer didn't work for me, on macOS), and it's way cleaner.
-1: This is a highly misleading answer - the original poster wanted to remove from the repository, not remove the files completely. I was this close to deleting a load of dynamic files required by my IDE but not required to be in the repo.
I did a very straightforward solution by manipulating the output of the .gitignore statement with sed:
- print the .gitignore file
- remove all comments from the print
- delete all empty lines
- add 'git rm -r ' to the start of the line
- execute every line.
+1 for scripting and explaining it. Explaining the danger of running it right into bash without review may have been an oversight.
" git clean " (man) and git ls-files -i (man) had confusion around working on or showing ignored paths inside an ignored directory, which has been corrected with Git 2.32 (Q2 2021).
That means the 2021 version of the accepted answer would be:
ls-files : error out on -i unless -o or -c are specified
Signed-off-by: Elijah Newren
ls-files --ignored (man) can be used together with either --others or --cached .
After being perplexed for a bit and digging in to the code, I assumed that ls-files -i was just broken and not printing anything and I had a nice patch ready to submit when I finally realized that -i can be used with --cached to find tracked ignores.
While that was a mistake on my part, and a careful reading of the documentation could have made this more clear, I suspect this is an error others are likely to make as well.
In fact, of two uses in our testsuite, I believe one of the two did make this error.
In t1306.13, there are NO tracked files, and all the excludes built up and used in that test and in previous tests thus have to be about untracked files.
However, since they were looking for an empty result, the mistake went unnoticed as their erroneous command also just happened to give an empty answer.-i will most the time be used with -o , which would suggest we could just make -i imply -o in the absence of either a -o or -c , but that would be a backward incompatible break.
Instead, let's just flag -i without either a -o or -c as an error, and update the two relevant testcases to specify their intent.
Файлы в рабочем каталоге Git можно отслеживать или нет.
Отслеживаемые файлы — это те, которые были добавлены и зафиксированы, и Git знает о них. Отслеживаемые файлы могут быть неизмененными, модифицированными или размещенными. Все остальные файлы в рабочем каталоге не отслеживаются, и git не знает об этих файлах.
Иногда ваш рабочий каталог git может быть загроможден ненужными файлами, которые либо автоматически сгенерированы, либо остались после слияния, либо созданы по ошибке. В таких ситуациях вы можете добавить эти файлы в .gitignore или удалить их. Если вы хотите, чтобы репозиторий оставался чистым и красивым, лучше всего удалить ненужные файлы.
В этой статье объясняется, как удалить неотслеживаемые файлы в Git.
Удаление неотслеживаемых файлов
Команда, которая позволяет удалить неотслеживаемые файлы, — это git clean .
Всегда рекомендуется делать резервную копию вашего репозитория, потому что после удаления файлы и внесенные в них изменения не могут быть восстановлены.
Перед запуском фактической команды и удалением неотслеживаемых файлов и каталогов используйте параметр -n , который выполнит «пробный запуск» и покажет вам, какие файлы и каталоги будут удалены:
Результат будет выглядеть примерно так:
Если некоторые из файлов, перечисленных выше, важны, вам следует либо начать отслеживать эти файлы с помощью git add либо добавить их в свой .gitignore .
Если вы уверены, что хотите продолжить и удалить неотслеживаемые файлы и каталоги, введите:
Команда распечатает все успешно удаленные файлы и каталоги:
Параметр -d указывает git удалять и неотслеживаемые каталоги. Если вы не хотите удалять пустые неотслеживаемые каталоги, опустите параметр -d .
Параметр -f означает силу. Если не используется и для переменной конфигурации Git clean.requireForce установлено значение true, Git не удалит файлы.
Чтобы в интерактивном режиме удалить неотслеживаемые файлы, используйте параметр -i :
Вывод покажет файлы и каталоги, которые нужно удалить, и спросит вас, что делать с этими файлами:
Выберите один из вариантов и нажмите Enter .
Если вы хотите ограничить операцию очистки заданными каталогами, передайте пути к каталогам, которые нужно проверить на наличие неотслеживаемых файлов, в качестве аргументов команды. Например, чтобы проверить файлы в каталоге src , вы должны запустить:
Удаление игнорируемых файлов
Команда git clean также позволяет удалять игнорируемые файлы и каталоги.
Чтобы удалить все игнорируемые и неотслеживаемые файлы, используйте параметр -x :
Если вы хотите удалить только игнорируемые файлы и каталоги, используйте параметр -X :
Приведенная выше команда удалит все файлы и каталоги, перечисленные в вашем .gitignore и сохранит неотслеживаемые файлы.
Выводы
В этом руководстве мы показали вам, как удалить неотслеживаемые файлы и каталоги в Git. Не забывайте всегда запускать команду всухую перед фактическим удалением файлов.
Часто при работе над проектом, использующим Git, вам нужно исключить определенные файлы или каталоги из отправки в удаленный репозиторий. Здесь .gitignore файл .gitignore .
Файл .gitignore указывает, какие неотслеживаемые файлы Git должен игнорировать.
Какие файлы следует игнорировать?
Игнорируемые файлы обычно представляют собой файлы для конкретной платформы или автоматически созданные файлы из систем сборки. Вот некоторые общие примеры:
- Файлы времени выполнения, такие как файлы журнала, блокировки, кеша или временные файлы.
- Файлы с конфиденциальной информацией, такой как пароли или ключи API.
- Скомпилированный код, например .class или .o .
- /node_modules зависимостей, например /vendor или /node_modules .
- Каталоги сборки, например /public , /out или /dist .
- Системные файлы, такие как .DS_Store или Thumbs.db
- Файлы конфигурации IDE или текстового редактора .
.gitignore Шаблоны
.gitignore — это простой текстовый файл, в каждой строке которого содержится шаблон, который файлы или каталоги следует игнорировать.
Он использует шаблоны подстановки для сопоставления имен файлов с подстановочными знаками. Если у вас есть файлы или каталоги, содержащие шаблон подстановки, вы можете использовать одиночную обратную косую черту ( ) для экранирования символа.
Комментарии
Символ косой черты ( / ) представляет собой разделитель каталогов. .gitignore черта в начале шаблона относится к каталогу, в котором находится .gitignore .
Если шаблон начинается с косой черты, он соответствует файлам и каталогам только в корне репозитория.
Если шаблон не начинается с косой черты, он соответствует файлам и каталогам в любом каталоге или подкаталоге.
Если шаблон заканчивается косой чертой, он соответствует только каталогам. Когда каталог игнорируется, все его файлы и подкаталоги также игнорируются.
Буквальные имена файлов
Самый простой шаблон — это буквальное имя файла без каких-либо специальных символов.
Шаблон | Примеры совпадений |
---|---|
/access.log | access.log |
access.log | access.log logs/access.log var/logs/access.log |
build/ | build |
Подстановочные символы
* — символ звездочки соответствует нулю или более символам.
Шаблон | Примеры совпадений |
---|---|
*.log | error.log logs/debug.log build/logs/error.log |
** — Два соседних символа звездочки соответствуют любому файлу или нулю или более каталогам. Если за ним следует косая черта ( / ), он соответствует только каталогам.
Шаблон | Примеры совпадений |
---|---|
logs/** | Соответствует чему-либо в каталоге logs . |
**/build | var/build pub/build build |
foo/**/bar | foo/bar foo/a/bar foo/a/b/c/bar |
? — Знак вопроса соответствует любому одиночному символу.
Шаблон | Примеры совпадений |
---|---|
access?.log | access0.log access1.log accessA.log |
foo?? | fooab foo23 foo0s |
Квадратных скобок
[. ] — соответствует любому из символов, заключенных в квадратные скобки. Когда два символа разделены дефисом - это обозначает диапазон символов. Диапазон включает все символы, которые находятся между этими двумя символами. Диапазоны могут быть буквенными или числовыми.
Если первый символ после [ — восклицательный знак ( ! ), То шаблон соответствует любому символу, кроме символов из указанного набора.
Шаблон | Примеры совпадений |
---|---|
*.[oa] | file.o file.a |
*.[!oa] | file.s file.1 file.0 |
access.2.log | access.0.log access.1.log access.2.log |
file.[ac].out | file.a.out file.b.out file.c.out |
file.[a-cx-z].out | file.a.out file.b.out file.c.out file.x.out file.y.out file.z.out |
access.[!0-2].log | access.3.log access.4.log access.Q.log |
Отрицательные паттерны
Шаблон, который начинается с восклицательного знака ( ! ), Отменяет (повторно включает) любой файл, который игнорируется предыдущим шаблоном. Исключением из этого правила является повторное включение файла, если его родительский каталог исключен.
Шаблон | Примеры совпадений |
---|---|
*.log !error.log | error.log или logs/error.log не будут проигнорированы |
.gitignore Пример
Ниже приведен пример того, как может выглядеть ваш файл .gitignore :
Местный .gitignore
.gitignore файл .gitignore обычно помещается в корневой каталог репозитория. Однако вы можете создать несколько файлов .gitignore в разных подкаталогах вашего репозитория. Шаблоны в файлах .gitignore сопоставляются относительно каталога, в котором находится файл.
Шаблоны, определенные в файлах, которые находятся в каталогах (подкаталогах) более низкого уровня, имеют приоритет над шаблонами в каталогах более высокого уровня.
Локальные файлы .gitignore используются совместно с другими разработчиками и должны содержать шаблоны, полезные для всех других пользователей репозитория.
Личные правила игнорирования
Шаблоны, специфичные для вашего локального репозитория и не подлежащие распространению в другие репозитории, должны быть установлены в файле .git/info/exclude .
Например, вы можете использовать этот файл, чтобы игнорировать файлы, сгенерированные из ваших личных инструментов проекта.
Глобальный .gitignore
Git также позволяет вам создать глобальный файл .gitignore , в котором вы можете определить правила игнорирования для каждого репозитория Git в вашей локальной системе.
Файл можно назвать как угодно и хранить в любом месте. Чаще всего этот файл хранится в домашнем каталоге. Вам придется вручную создать файл и настроить Git для его использования.
Например, чтобы установить ~/.gitignore_global в качестве глобального файла игнорирования Git, вы должны сделать следующее:
Добавьте файл в конфигурацию Git:
Откройте файл в текстовом редакторе и добавьте в него свои правила.
Глобальные правила особенно полезны для игнорирования определенных файлов, которые вы никогда не хотите фиксировать, например файлов с конфиденциальной информацией или скомпилированных исполняемых файлов.
Игнорирование ранее зафиксированных файлов
Файлы в вашей рабочей копии можно отслеживать или нет.
Чтобы проигнорировать файл, который был ранее зафиксирован, вам нужно деактивировать и удалить файл из индекса, а затем добавить правило для файла в .gitignore :
Параметр --cached указывает git не удалять файл из рабочего дерева, а только удалять его из индекса.
Чтобы рекурсивно удалить каталог, используйте параметр -r :
Если вы хотите удалить файл и из индекса, и из локальной файловой системы, опустите параметр --cached .
При рекурсивном удалении файлов используйте параметр -n , который выполнит «пробный запуск» и покажет вам, какие файлы будут удалены:
Отладка файла .gitignore
Иногда бывает сложно определить, почему игнорируется конкретный файл, особенно когда вы используете несколько файлов .gitignore или сложные шаблоны. Здесь пригодится команда git check-ignore с параметром -v , которая сообщает git отображать сведения о соответствующем шаблоне.
Например, чтобы проверить, почему файл www/yarn.lock игнорируется, вы должны запустить:
Вывод показывает путь к файлу gitignore , номер совпадающей строки и фактический шаблон.
Команда также принимает в качестве аргументов более одного имени файла, и файл не обязательно должен существовать в вашем рабочем дереве.
Отображение всех игнорируемых файлов
Команда git status с параметром --ignored отображает список всех игнорируемых файлов:
Выводы
Файл .gitignore позволяет исключить файлы из репозитория. Файл содержит шаблоны подстановки, которые описывают, какие файлы и каталоги следует игнорировать.
gitignore.io — это онлайн-сервис, который позволяет создавать файлы .gitignore для вашей операционной системы, языка программирования или IDE.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
При редактировании файла .gitignore добавленные правила применяются только к неотслеживаемым файлам.
У меня есть каталог с именем backup в моем локальном git-репозитории с двумя файлами.
Ниже приведен файл .gitignore, который я изменил, чтобы игнорировать файлы в этом каталоге.
Шаг 1. Отключите файлы / каталог
Отметьте файлы для удаления, используя команду git rm -r –cached.
Шаг 2: Сделайте новый коммит
Сохраните ваш новый объект фиксации / изменения в локальном репозитории Git.
Шаг 3: Перенос изменений в удаленный репозиторий git
Предыдущая команда сохранила изменения в локальном репозитории git.
Вставьте их в удаленный репозиторий с помощью команды:
Это все. Вы успешно удалили каталог / файлы из удаленного репозитория после добавления их в файл .gitignore.
One thought on “ Как удалить файлы git, каталоги в .gitignore из удаленного репозитория ”
Шаг 1 и Шаг 2 задвоены
Добавить комментарий Отменить ответ
Эта простая однострочная программа для Powershell выведет текущее время работы вашего компьютера. Вывод показан в несколько столбцов, но может быть выведен и в одну строку. PS C:\Users\Windows 11> (get-date) - (gcim Win32_OperatingSystem).LastBootUpTime Days : 0 Hours : 0 Minutes : 41 Seconds : 27 Milliseconds : 915 Ticks : 24879150105 TotalDays : 0.0287953126215278.
Ошибка 504 gateway time-out возникает тогда, когда Nginx не может получить ответ от службы достаточно долго. Например, от PHP-FPM. Nginx и PHP-FPM Наиболее распространенной причиной этой ошибки является совместная работа Nginx и PHP-FPM. В случае очень медленных PHP-скриптов Nginx выдает тайм-аут шлюза 504, когда не ожидает ответа в течение 30 секунд (по умолчанию). Чтобы избавиться.
17 сентября 2021 года произошло событие, всколыхнувшее кинематографический мир. На платформе Netflix появился корейский сериал “Игра в кальмара”. Всего пары недель ему хватило для того, чтобы выйти на первые позиции по популярности не только на Родине, но и в Соединенных Штатах, России. Оценить сюжет сериал можно не только просмотром, но и игрой squid game challenge скачать которую.
Читайте также: