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

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

11 ответов


Обновление 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 and .файлы проекта в репозиторий. Я не могу перенести это изменение .gitIgnore в удаленном РЕПО на данный момент.

.classpath and .файлы проектов важны для eclipse-моего редактора java.

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

Я

 git stash 

для хранения модифицированных .файла.gitignore

для припрятать .classpath and .файл проекта, я использовал

git stash --include-untracked

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

git stash pop

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


как уже было сказано в другом месте, ответ 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 -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, в случае, если вы не хочу!--15--> но apply, и / или хотите иметь возможность указать конкретный тайник, а не просто взять верхний. Возможно, это (вместо второго псевдонима, выше) [пробелы разделены, чтобы соответствовать без прокрутки; re-add для повышения удобочитаемости]:

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

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

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

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


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

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

git stash save -u

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

git stash save -u <name_of_stash>

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

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}

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


здесь есть несколько правильных ответов, но я хотел бы отметить, что для новых целых каталогов,'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 это единственный путь, который вы прячете, тайник "temp stash" будет пустым тайником. Правильный способ-добавить весь путь, а не только имя каталога (т. е. конец пути с '/'):

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

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

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 stash save --include-untracked

или

git stash save -u

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


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

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