Как вы храните неотслеживаемый файл?

У меня есть изменения в файле плюс новый файл, и я хотел бы использовать git stash, чтобы убрать их, пока я переключаюсь на другую задачу. Но git stash сам хранит только изменения в существующем файле; новый файл остается в моем рабочем дереве, загромождая мою будущую работу. Как спрятать этот неотслеживаемый файл?

20 ответов

Решение

Обновление 17 мая 2018 года:

Новые версии Git теперь есть git stash --all который хранит все файлы, включая неотслеживаемые и игнорируемые файлы.
git stash --include-untracked больше не касается игнорируемых файлов (протестировано на git 2.16.2).

Оригинальный ответ ниже:

Внимание, это навсегда удалит ваши файлы, если у вас есть какие-либо записи каталога /* в вашем файле gitignore.

Начиная с версии 1.7.7 вы можете использовать git stash --include-untracked или же git stash save -u хранить неотслеживаемые файлы, не размещая их.

Добавлять (git add) файл и начать его отслеживание. Тогда заначка. Поскольку все содержимое файла новое, оно будет спрятано, и вы можете манипулировать им по мере необходимости.

По состоянию на git 1.7.7, git stash принимает --include-untracked вариант (или сокращенная -u). Чтобы включить неотслеживаемые файлы в ваш тайник, используйте одну из следующих команд:

git stash --include-untracked
git stash -u

Внимание, это навсегда удалит ваши файлы, если у вас есть какие-либо записи каталога /* в вашем файле gitignore.

Добавьте файл в индекс:

git add path/to/untracked-file
git stash

Все содержимое индекса, а также любые неустановленные изменения в существующих файлах, попадут в тайник.

В git bash сохранение неотслеживаемых файлов достигается с помощью команды

git stash --include-untracked

или же

git stash -u

http://git-scm.com/docs/git-stash

Git Stash удаляет все неотслеживаемые или незафиксированные файлы из вашего рабочего пространства. И вы можете восстановить git stash с помощью следующих команд

git stash pop

Это поместит файл обратно в ваше локальное рабочее пространство.

Мой опыт

Мне пришлось внести изменения в мой файл gitIgnore, чтобы избежать перемещения файлов.classpath и.project в удаленное хранилище. Мне не разрешено перемещать этот измененный.gitIgnore в удаленном репо на данный момент.

Файлы.classpath и.project важны для eclipse - моего редактора java.

Прежде всего, я выборочно добавил остальные файлы и отправил их на постановку. Тем не менее, окончательная отправка не может быть выполнена, если только измененные поля.gitIgnore и неотслеживаемые файлы, а именно..project и.classpath не спрятаны.

я использовал

 git stash 

для хранения измененного файла.gitIgnore.

Для хранения файлов.classpath и.project я использовал

git stash --include-untracked

и он удалил файлы из моей рабочей области. Отсутствие этих файлов лишает меня возможности работать на рабочем месте в затмении. Я продолжил с завершением процедуры отправки подтвержденных файлов на удаленный компьютер. Как только это было сделано успешно, я использовал

git stash pop

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

На git версии 2.8.1: у меня работает следующее.

Сохранять измененные и неотслеживаемые файлы в stash без имени

git stash save -u

Сохранять измененные и неотслеживаемые файлы в stash с именем

git stash save -u <name_of_stash>

Вы можете использовать любой поп и применить позже следующим образом.

git stash pop

git stash apply stash@{0}

Новое в версии 2.35

Новый режим git stash --staged позволяет легко спрятать то, что у вас уже есть в области подготовки, и ничего больше. Вы можете думать об этом как о git commit (который записывает только поэтапные изменения), но вместо создания нового коммита он записывает новую запись в тайник. Затем, когда вы будете готовы, вы можете восстановить свои изменения (с помощью git stash pop) и продолжить работу.

      git add -A
git stash --staged

Обновленный ответ в 2020 году

Я был удивлен, что ни в одном другом ответе на этой странице не упоминалось git stash push.

Эта статья помогла мне понять:

Команда git stash сокращение для git stash push. В этом режиме не допускается использование аргументов, не являющихся опциями, чтобы подкоманда с ошибкой не могла создать нежелательную запись в тайнике. Есть еще один псевдоним для этой командыgit stash save который устарел в пользу git stash push.

По умолчанию git игнорирует неотслеживаемые файлы при выполнении stash. Если эти файлы нужно добавить в тайник, вы можете использовать-uoptions, который сообщает git включать неотслеживаемые файлы. Игнорируемые файлы также могут быть добавлены, если-a опция указана. -a будут включать как неотслеживаемые, так и игнорируемые файлы.

Я забочусь об именах моих тайников и хочу, чтобы они включали неотслеживаемые файлы, поэтому чаще всего я запускаю следующую команду: git stash push -u -m "whatIWantToNameThisStash"

Как было сказано в другом месте, ответ заключается в git add файл. например:

git add path/to/untracked-file
git stash

Однако, вопрос также поднимается в другом ответе: что, если вы действительно не хотите добавлять файл? Ну, насколько я могу судить, ты должен. И следующее НЕ будет работать:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

это потерпит неудачу, как показано ниже:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Так что ты можешь сделать? Ну, вы должны действительно добавить файл, однако, вы можете эффективно удалить его позже, с git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

И тогда вы можете продолжать работать, в том же состоянии, в котором вы были до git add (а именно с неотслеживаемым файлом path/to/untracked-file; плюс любые другие изменения, которые вы, возможно, должны были отслеживать файлы).

Еще одна возможность для рабочего процесса на этом будет что-то вроде:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Примечание: как упомянуто в комментарии от @mancocapac, вы можете добавить --exclude-standard к git ls-files команда (так, git ls-files -o --exclude-standard ).]

... что также может быть легко написано в сценарии - подойдут даже псевдонимы (представленные в синтаксисе zsh; при необходимости измените) [также я сократил имя файла, чтобы оно умещалось на экране без прокрутки в этом ответе; не стесняйтесь подставлять альтернативное имя файла по вашему выбору]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Обратите внимание, что последний может быть лучше в качестве сценария или функции оболочки, чтобы параметры могли быть предоставлены git stash на тот случай, если ты не хочешь pop но apply и / или хотите иметь возможность указать конкретный тайник, а не просто взять верхний. Возможно, это (вместо второго псевдонима выше) [пропущено пустое пространство без прокрутки; повторно добавить для повышения читаемости]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Примечание. В этой форме вам необходимо указать аргумент действия, а также идентификатор, если вы собираетесь указать идентификатор тайника, например unstashall apply stash@{1} или же unstashall pop stash@{1}

Что, конечно, вы бы положили в свой .zshrc или эквивалент, чтобы существовать в долгосрочной перспективе.

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

Чтобы включить неотслеживаемые файлы в тайник, вы можете использовать команду--include-untrackedили-uвариант с командой.

      git stash --include-untracked

или

      git stash -u

Объяснение:

Когда вы работаете с незафиксированными изменениями, включая новые файлы, Git сохранит ваши изменения во временном стеке, называемомstash. Однако по умолчанию сохраняются только отслеживаемые файлы. Любые новые неотслеживаемые файлы не будут включены в тайник.

Если вы добавили новый файл в свой репозиторий, а затем запустилиgit stash, операция хранения не сохранит новый файл. Новый файл останется неотслеживаемым в вашем рабочем каталоге.

git stash --include-untrackedили git stash -uсохранит как ваши измененные отслеживаемые файлы, так и все неотслеживаемые файлы в тайнике, что позволит вам получить их позже, используяgit stash applyилиgit stash pop.

Я смог спрятать только неотслеживаемые файлы, выполнив:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Последний извлекает тайник отслеживаемых файлов, оставляя таким образом только неотслеживаемые файлы.

просто запустите эту команду в каталоге вашего проекта

git stash --include-untracked

Сохранение доступно в VS 2019 и более поздних версиях.

  1. Перейти к окну изменений Git Ctrl + Alt + F7
  2. Теперь нажмите клавишу раскрывающегося списка рядом с Commit Allили же Commit stagedкнопка, чтобы увидеть параметры тайника

Если вы хотите спрятать неотслеживаемые файлы, такие как Git ignored filesили же Files which are not included into projectтогда выбирайте этот вариант

Прочитайте этот ответ для полного использования тайника Git в Visual Studio: https://stackoverflow.com/a/69905607/4391394

Если вы хотите сохранить неотслеживаемые файлы, но сохранить индексированные файлы (например, те, которые вы собираетесь зафиксировать), просто добавьте -k (сохранить индекс) вариант для -u

git stash -u -k

Давайте предположим, что новый и неотслеживаемый файл называется: "views.json". если вы хотите изменить ветку, сохраняя состояние вашего приложения, я обычно набираю:

git add views.json

Затем:

git stash

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

git checkout other-nice-branch

Как спрятать неотслеживаемый файл?

      git stash --include-untracked

Вы можете просто сделать это с помощью команды ниже

git stash save --include-untracked

или же

git stash save -u

Для получения дополнительной информации о git stash Посетите этот пост (Нажмите здесь)

Я думал, что это можно решить, сказав git, что файл существует, а не передавая все его содержимое в область подготовки, и затем вызвав git stash, Аракнид описывает, как сделать первое.

git add --intent-to-add path/to/untracked-file

или же

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Однако последний не работает:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Здесь есть несколько правильных ответов, но я хотел бы отметить, что для новых целых каталогов, 'git add path' НЕ будет работать. Так что, если у вас есть куча новых файлов в unraracked-path и вы делаете это:

git add untracked-path
git stash "temp stash"

это будет скрыто со следующим сообщением:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

и если путь без отслеживания - единственный путь, который вы копируете, тайник "временный тайник" будет пустым тайником. Правильный путь заключается в добавлении всего пути, а не только имени каталога (т.е. заканчивайте путь символом '/'):

git add untracked-path/
git stash "temp stash"

Я столкнулся с аналогичной проблемой при использовании Sourcetree с вновь созданными файлами (они тоже не будут включены в тайник).

Когда я сначала выбрал "этап все", а затем спрятал вновь добавленные компоненты, где они отслеживаются и поэтому включены в тайник.

Я привык размышлять и желать ту же функцию. Но со временем я заметил, что это действительно не нужно. Когда вы прячетесь, все в порядке, чтобы оставить новые файлы. Ничего "плохого" с ними не случится (когда вы проверяете что-то еще, git выдаст ошибку и не перезапишет существующий неотслеживаемый файл)

И так как обычно временные рамки между git stash и git stash pop достаточно небольшой, вам снова понадобится неотслеживаемый файл. Так что я бы сказал, неудобство файла, отображаемого в git status пока вы работаете над чем-то другим (между git stash и git stash pop) меньше неудобства, вызванного работой и необходимого внимания, в противном случае стоило бы попытаться добавить неотслеживаемый файл в ваш тайник.

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