git - 你怎么储藏取消跟踪文件?

  显示原文与译文双语对照的内容

我已经更改了一个文件,还有一个新文件,并且希望使用git存储来将它们放到另一个任务中。 但是,git存储本身只保存对现有文件的修改;新文件留在我的工作树中,搞乱了我的未来工作。 如何保存这个未跟踪的文件?

时间:

添加( git add ) 文件并开始跟踪它。 然后保存。由于文件的全部内容是新的,它们将被隐藏,你可以根据需要操作它。

在版本 1.7.7中,你可以使用 git stash -u 来存放未跟踪的文件,而不用暂存它们。

警告,如果你的gitignore文件中有任何目录/* 条目,这样做会永久删除你的文件。

在 git 1.7.7中,git stash 接受 --include-untracked 选项( 或者 shorthand -u ) 。 要在你的存储中包含未跟踪的文件,请使用以下命令之一:


git stash --include-untracked
git stash -u

警告,如果你的gitignore文件中有任何目录/* 条目,这样做会永久删除你的文件。

将文件添加到索引:


git add path/to/untracked-file
git stash

索引的全部内容,加上对现有文件的任何更改,都将把它放到存储中。

就像前面所说的,答案是 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

那么,你能做什么? 通过添加该文件,但是 井,你必须真正,你以后可以有效un-add它, :


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

- - 它甚至还可以很容易脚本式--别名会做( 以zsh语法显示;根据需要调整) [also, i shortened the filename so it all fits on the screen without scrolling in this answer; feel free to substitute an alternate filename of your choosing]:


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'

请注意,后者可能更好地作为一个shell脚本或者函数,允许提供参数给 git stash,以防你需要 pop,而不是,而不仅仅是 apply,而不仅仅是。 也许这个( 而不是第二个别名,上面) [whitespace stripped to fit without scrolling; re-add for increased legibility]:


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

注意: 在这里表单,你需要提供一个操作参数,以及如果你打算提供一个隐藏的标识符标识符,比如 unstashall apply stash@{1} 或者 unstashall pop stash@{1}

你将在 .zshrc 中放入哪些课程,或者使它的长期存在。

希望这个答案对某人有帮助,把一切都放在一个答案中。

这里有几个正确答案,但我只想指出,对于新的整个目录,'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 是唯一的路径,那么储藏"临时储藏"将是一个空的存储。 正确的方法是添加整个路径,而不仅仅是目录名( 例如 。 使用'/'结束路径:


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

在 git bash中,通过使用命令来保存未跟踪的文件


git stash --include-untracked

或者

 
git stash -u

 

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

git存储从你的工作区中删除任何未跟踪或者uncommited文件。 你可以使用以下命令恢复git存储

 
git stash pop

 

这将把文件放到你的本地工作区。

我的经验

我必须对我的gitIgnore文件执行修改以避免将类路径和项目文件移动到远程存储库中。 我不允许在远程仓库中移动这里修改的gitignore 。

类路径和项目文件对于 Eclipse 来说非常重要- 这是我的java编辑器。

我首先有选择地添加了剩下的文件并提交了。 然而,final 推不能被执行,除非修改。gitignore fiels和未跟踪的文件即是。 项目和类路径不被隐藏。

我使用了


 git stash 

用于保存修改后的。gitignore文件。

对于 stashing 。classpath和。projectserver文件,我使用了


git stash --include-untracked

它从我的工作区中删除了文件。 缺少这些文件将剥夺我在 Eclipse 中工作的能力。 我继续完成将提交的文件推入远程的过程。 成功完成后,我使用了

 
git stash pop

 

在我的工作区中粘贴了相同的文件。 这给了我在 Eclipse 中工作的能力。 希望这种笔刷能消除误解。

我认为这可以通过告诉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将错误,不会覆盖现有的未跟踪文件)

而且由于 git stashgit stash pop 之间的时间框架比较小,所以你将需要再次使用未跟踪的文件。 所以,我要说的是,在 git status 中显示的文件的不便,当你处理其他东西时,它会减少你的工作带来的不便,并将未跟踪的文件添加到你的存储中。

...