在分支签出之间保留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 。 但我不想将文件添加到排除列表中,所以我在我的工作树目录中执行了以下操作:

  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>中包含更改