Восстановление от забвения к.gitignore

Я был пойман на то, что кажется достаточно распространенной проблемой для новичков мерзавцев.

Я забыл.gitignore определенный файл, и добавление его в.gitignore после фиксации не имеет значения.

Я нашел эту страницу на gitready, которая объясняет, как удалить файл из хранилища, не удаляя его из рабочего дерева (с помощью команды git rm --cached <file>, который работает нормально, за исключением того, что если я затем попытаюсь объединить это обратно в другую ветку, файлы в рабочем дереве будут удалены.

Действия по воспроизведению в пустой папке:

git init
touch want.txt
touch wantnot.txt
git add .
git commit -m "Initial"
git checkout -b BranchForIgnore
git rm --cached wantnot.txt
cat > .gitignore
wantnot.txt  [Ctrl-D Ctrl-D here to exit cat]
git add .
git commit -m "Ignoring file"

До здесь все хорошо

git checkout master
git merge BranchForIgnore

На данный момент мои файлы wantnot.txt больше не находятся в моем мастере, и очевидно, что проверка BranchForIgnore также не поможет.

Что делать?

2 ответа

Решение

Я забыл.gitignore определенный файл, и добавив его в .gitignore после совершения не имеет значения.

Ну, конечно, нет. Игнорирование относится к неотслеживаемым файлам (что означает, что файлы не контролируются версиями).

Я нашел страницу на gitready, которая объясняет, как удалить файл из хранилища, не удаляя его из рабочего дерева (с помощью команды git rm --cached <file> , который работает нормально, за исключением того, что если я затем попытаюсь объединить это обратно в другую ветку, файлы в рабочем дереве будут удалены.

Git удаляет файл, потому что вы можете восстановить его, так как он отслеживался в одной ветке.

Решением будет фиксация файла (удаление файла из системы контроля версий) во всех ветвях с использованием git cherry-pick или делая git rm --cached <file> && git commit -a в отдельной ветке коммита, затем объединяя эту ветку темы во все ветки (и затем восстанавливая файл из отслеживаемой версии).

Переименуйте файл во временное имя (без использования git), зафиксируйте удаление плюс файл.gitignore, затем переименуйте файл обратно к его первоначальному имени.

mv wantnot.txt wantnot.txt.tmp
git rm wantnot.txt
echo wantnot.txt >.gitignore
git add .gitignore
git commit -m "remove mistakenly committed wantnot.txt"
mv wantnot.txt.tmp wantnot.txt

Использование вами отдельной ветки для этого может излишне запутать проблему.

Другие вопросы по тегам