Вопрос

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

Это было полезно?

Решение

Обновление от 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 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}

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

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

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

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

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

git stash save -u

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

git stash save -u <name_of_stash>

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

git stash pop

git stash apply stash@{0}

Мне удалось спрятать просто неотслеживаемые файлы, выполнив:

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}

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

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

git stash -u -k

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

git stash save --include-untracked

или

git stash save -u

Подробнее о git stash читайте здесь Посетите этот пост (нажмите здесь).

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

git add views.json

Тогда:

git stash

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

git checkout other-nice-branch

Здесь есть несколько правильных ответов, но я хотел бы отметить, что для новых целых каталогов 'git add path' будет НЕ Работа. Так что, если у вас есть куча новых файлов в untracked-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

и если untracked-path - единственный путь, который вы сохраняете, stash " temp stash " будет пустой тайник. Правильный способ - добавить весь путь, а не только имя каталога (то есть завершить путь символом '/'):

git add untracked-path/
git stash "temp 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 выдаст ошибку и не перезапишет существующий неотслеживаемый файл)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top