Как заставить Git & ldquo; забыть & rdquo; о файле, который был отслежен, но теперь находится в .gitignore?

Используйте параметр MySqlCommand вместо того, чтобы создавать свой собственный запрос и передавать параметр DateTime в качестве параметра. Не требуется форматирование.

4548
задан Akshay Sood 20 December 2017 в 16:13
поделиться

6 ответов

.gitignore предотвратит добавление неотслеживаемых файлов (без add -f ) в набор файлов, отслеживаемых git, однако git будет продолжать отслеживать любые файлы, которые уже отслеживаются.

Чтобы остановить отслеживание файла, вам нужно удалить его из индекса. Это может быть достигнуто с помощью этой команды.

git rm --cached <file>

Если вы хотите удалить всю папку, вам нужно удалить все файлы в ней рекурсивно.

git rm -r --cached <folder>

Удаление файла из основной ревизии произойдет при следующей фиксации.

ПРЕДУПРЕЖДЕНИЕ: хотя это не приведет к удалению физического файла с вашего локального компьютера, оно удалит файлы с машин других разработчиков на следующем git pull .

5131
ответ дан 22 November 2019 в 19:37
поделиться

Это больше не проблема в последнем git (v2.17.1 на момент написания).

.gitignore окончательно игнорирует отслеженные, но удаленные файлы. Вы можете проверить это сами, запустив следующий скрипт. В последнем git status заявлении должно быть указано «нечего делать».

# Create empty repo
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status
2
ответ дан Lloyd 20 December 2017 в 16:13
поделиться

принятый ответ "не делает Мерзавца , "забывают" о файле..." (исторически). Это только делает мерзавца , игнорируют файл в подарке/будущем.

Этот метод делает мерзавца , полностью забывают проигнорированные файлы ( прошлый /present/future), но делает не , удаляют что-либо из рабочего каталога (даже когда повторно вытянуто от удаленного).

Этот метод требует, чтобы использование /.git/info/exclude (предпочло) ИЛИ существование ранее .gitignore в [1 157] весь фиксации, которые имеют файлы, которые будут игнорироваться/забываться. <глоток> 1

Все методы осуществления мерзавца игнорируют поведение, после совершения эффективно переписывают историю и таким образом имеют значительные разветвления для любого общедоступного/общего/совместного repos, который можно было бы вытянуть после этого процесса. <глоток> 2

Общие рекомендации: запускаются с чистого repo - все фиксировавшее, ничто ожидающее в рабочем каталоге или индексе, и делают резервное копирование !

кроме того, комментарии / история пересмотра из [1 120] этот ответ ( и история пересмотра из [1 122] этот вопрос ) может быть полезным/поучительным.

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch

git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch

git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch

git commit -m "ignored index"

#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits.  If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command

git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all

#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch

git ls-files --other --ignored --exclude-standard
<час>

Наконец, следуйте за остальной частью это руководство GitHub (запускающийся на шаге 6) , который включает важные предупреждения/информацию о командах ниже .

git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
<час>

Другие devs, которые вытягивают от теперь измененного удаленного repo, должны сделать резервное копирование и затем:

#fetch modified remote

git fetch --all

#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed

git reset FETCH_HEAD
<час>

Сноски

<глоток> 1 , поскольку /.git/info/exclude может быть применен ко всем историческим фиксациям с помощью инструкций выше, возможно, детализируют о получении .gitignore файл в [1 133] историческая фиксация (фиксации), которым нужен он, выходит за рамки этого ответа. Я хотел, чтобы надлежащее .gitignore было в корневой фиксации, как будто это была первая вещь, которую я сделал. Другие не могут заботиться, так как /.git/info/exclude может выполнить то же самое независимо, где эти .gitignore существует в истории фиксации, и ясно перезапись истории очень щекотливая тема, даже когда знающий эти разветвления .

FWIW, потенциальные методы могут включать git rebase или git filter-branch, который копирует внешний .gitignore в каждую фиксацию, как ответы на [1 125] этот вопрос

<глоток> 2 , Осуществление мерзавца игнорирует поведение после совершения путем фиксации результатов автономного git rm --cached, команда может привести к недавно проигнорированному удалению файла в будущих получениях по запросу от продвинутого силой удаленного. Эти --prune-empty флаг в следующем git filter-branch команда избегает, чтобы эта проблема путем автоматического удаления предыдущего "удалила все проигнорированные файлы" фиксация только для индекса. Перезапись истории мерзавца также изменяет хеши фиксации, которые будут наносить ущерб будущим получениям по запросу от общедоступного/общего/совместного repos. Поймите эти разветвления полностью прежде, чем сделать это к такому repo. Это руководство GitHub определяет следующее:

Говорят Вашим сотрудникам [1 129] переоснова , не слияние, любые ответвления, которые они создали прочь Вашей старой (испорченной) истории репозитория. Одна фиксация слияния могла повторно ввести некоторых или всю испорченную историю, которой Вы просто перешли к проблеме произвести чистку.

Альтернативные решения, которые не делают , влияют на удаленный repo, git update-index --assume-unchanged </path/file> или git update-index --skip-worktree <file>, примеры которого могут быть найдены здесь .

2
ответ дан 22 November 2019 в 19:37
поделиться

Переместите или скопируйте файл в безопасное место, чтобы не потерять его. Затем git rm файл и зафиксируйте. Файл все равно будет отображаться, если вы вернетесь к одной из этих предыдущих коммитов или к другой ветке, где он не был удален. Однако во всех будущих коммитах вы больше не увидите этот файл. Если файл находится в git ignore, вы можете переместить его обратно в папку, и git его не увидит.

8
ответ дан 22 November 2019 в 19:37
поделиться

переместите его, зафиксируйте, затем верните обратно. Это работало для меня в прошлом. Вероятно, есть более «мерзкий» способ добиться этого.

61
ответ дан 22 November 2019 в 19:37
поделиться

Я сделал это с помощью git filter-branch . Точная команда, которую я использовал, была взята из справочной страницы:

ПРЕДУПРЕЖДЕНИЕ : это удалит файл из всей вашей истории

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Эта команда воссоздает всю историю фиксации, выполнив git rm перед каждой фиксацией и поэтому избавится от указанного файла. Не забудьте сделать резервную копию перед запуском команды, поскольку она будет потеряна.

46
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: