Как вы храните неотслеживаемый файл? - PullRequest
1158 голосов
/ 07 мая 2009

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

Ответы [ 13 ]

1505 голосов
/ 07 мая 2009

Обновление от 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) файл и начните его отслеживание. Тогда заначка. Поскольку все содержимое файла новое, оно будет спрятано, и вы можете манипулировать им при необходимости.

378 голосов
/ 25 июля 2011

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

git stash --include-untracked
git stash -u

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

68 голосов
/ 07 мая 2009

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

git add path/to/untracked-file
git stash

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

49 голосов
/ 29 августа 2014

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

git stash --include-untracked

или

git stash -u

http://git -scm.com / документы / ГИТ-притон

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

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

20 голосов
/ 06 февраля 2011

Как уже было сказано, ответом является git add файл. e.g.:

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 или эквивалент, чтобы сделать его долгосрочным.

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

12 голосов
/ 20 февраля 2018

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

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

git stash save -u

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

git stash save -u <name_of_stash>

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

git stash pop

git stash apply stash@{0}
6 голосов
/ 07 мая 2017

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

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}

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

2 голосов
/ 19 ноября 2018

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

git add views.json

Тогда:

git stash

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

git checkout other-nice-branch

1 голос
/ 04 марта 2019

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

git stash -u -k
1 голос
/ 28 мая 2018

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

git stash save --include-untracked

или

git stash save -u

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

...