在分支签出之间保留git –assume – 不变的文件
我一直在使用git --assume-unchanged yacs/settings/development.py
来忽略我的本地数据库configuration文件在我的开发分支。 但是,当我想切换分支(部署),我得到一个错误,我仍然有待处理的更改:
% git checkout production error: Your local changes to the following files would be overwritten by checkout: yacs/settings/development.py Please, commit your changes or stash them before you can switch branches. Aborting
这是烦人的。 我知道如何解决这个问题的唯一方法就是把它藏起来:
% git stash % git checkout production % git merge dev % ./deploy.sh % git checkout dev % git stash pop # On branch dev # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: yacs/settings/development.py #
但是现在它又回到了索引(呃)! 有没有更好的替代这个工作stream程?
[我并不特别在意本地更改是否保留在本地(也就是说,如果是生产分支的话),我只是不希望把它推送到远程仓库。]
你可以尝试( git update-index手册页 ):
git update-index --skip-worktree -- path
Skip-worktree位可以在一个(长)句子中定义:当读取一个条目时,如果它被标记为skip-worktree,那么Git会假装它的工作目录版本是最新的,并且读取索引版本。
但是,正如“ git假定不变与跳过工作树 ”一样:
两个选项都有问题。
--assume-unchanged
每当索引被丢弃(例如git reset
)时,--assume-unchanged
都会自动git reset
,这样可能迟早会让你--assume-unchanged
。--skip-worktree
。
我开始做的是创build一个名为私人的分支,有我的本地变化; 把它看作是我的工作分支和主人之间的代理分支。 当我需要我的本地更改时,我可以将我当前的工作分支与私有分支重新绑定,并且在我的.gitconfig中有几个别名,可以自动保持私有分支与主服务器的最新状态。 当我需要合并到掌握,我的别名确保rebase – 大师私人我的工作分支。
我在这里更详细地发布了关于此的博客条目http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html
为我工作的解决scheme是使用–skip-worktree。 然而,就像上面所说的那样,即使我在文件中设置了–skip-worktree标志,而我想保持本地化的变化,我也能够在没有git抱怨的情况下在tankted分支和主分支之间切换。
如果在运行–skip-worktree之前更改了仅限本地的文件,这似乎就会遇到此问题,这正是我发生的情况。
上面的一个build议的解决方法是将文件添加到your_repo/.git/info/exclude
。 但我不想将文件添加到排除列表中,所以我在我的工作树目录中执行了以下操作:
-
cp <local-only_file> ~/
- 复制文件,只有您的本地更改文件系统上的某个安全的地方
-
git checkout <local-only_file>
- 在工作树,结帐文件,以便它匹配主分支文件
-
git update-index --skip-worktree -- <local-only_file>
-
cp ~/<local-only_file> .
- 将有问题的文件从安全位置复制回工作树
-
git diff
- 不应该显示变化; 如果您推送到主库,则不会在
<local-only_file>
中包含更改
- 不应该显示变化; 如果您推送到主库,则不会在