在分支机构检出之间保留git --assume-unchanged文件

时间:2012-03-22 01:54:08

标签: git

我一直在使用git --assume-unchanged yacs/settings/development.py忽略我的dev分支中的本地数据库配置文件。但是,当我想切换分支(用于部署)时,我收到一个错误,我仍然有待更改:

% 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
#

但现在又回到了指数中(呃)!有没有比这个工作流程更好的替代方案?

[我并不特别在意本地更改是否保留在本地(例如,如果它是生产分支就没关系),我只是不希望它被推送到远程存储库。]

4 个答案:

答案 0 :(得分:20)

您可以尝试(git update-index man page):

git update-index --skip-worktree -- path
  

Skip-worktree位可以在一个(长)句子中定义:当读取一个条目时,如果它被标记为skip-worktree,那么Git假装它的工作目录版本是最新的,而是读取索引版本。 / p>

但是,如“git assume unchanged vs skip worktree”中所述:

  

两种选择都有问题。每当索引被丢弃时--assume-unchanged都会自行重置(例如git reset),这样可能会迟早绊倒你。同样适用于--skip-worktree

答案 1 :(得分:3)

我开始做的是创建一个名为private的分支,它具有我的本地更改;把它想象成我的工作分支和主人之间的代理分支。当我需要我的本地更改时,我可以将我当前的工作分支重新设置为私有,并且我的.gitconfig中有几个别名可以自动保持私有与主服务器保持同步。当我需要合并到master时,我的别名一定要先重新设置 - 主要私有我的工作分支。

我在http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html

更详细地发布了一篇关于此内容的博客文章

答案 2 :(得分:2)

对我有用的解决方案是使用--skip-worktree。但是,就像上面的一些内容一样,即使我在文件中设置了--skip-worktree标志,我希望保持本地化后,我仍然很难在没有git抱怨的情况下在一个票据分支和主分支之间切换。

如果您在运行--skip-worktree之前更改了仅本地文件,似乎您会遇到此问题,这就是发生在我身上的事。

上面提到的一个解决方法是将文件添加到your_repo/.git/info/exclude。但是我不想将文件添加到排除列表中,所以我在工作树目录中执行了以下操作:

  1. cp <local-only_file> ~/
    • 将仅对本地更改的文件复制到文件系统上安全的地方
  2. git checkout <local-only_file>
    • 在工作树,结帐文件中,以便与主分支文件匹配
  3. git update-index --skip-worktree -- <local-only_file>
  4. cp ~/<local-only_file> .
    • 将有问题的文件从安全位置复制回工作树
  5. git diff
    • 不应显示任何变化;如果您推送到主仓库,则推送
    • 中不会包含<local-only_file>中的任何更改

答案 3 :(得分:0)

如果跳过的文件与您要检出的分支中的文件或您尝试提取的文件不同,则会出现此问题。