在--skip-worktree之后切换分支是不可能的

Era*_*ray 37 git git-branch git-assume-unchanged git-skip-worktree

我想做的事

我有一个包含敏感数据的文件,所以我不想将此文件的内容推送到远程服务器.

我做了什么?

为了实现这一点,我在文件为空时进行了提交,并将此空文件推送到服务器(GitHub).然后用敏感数据填充文件并应用git update-index --skip-worktree path/to/file.但我没有做出任何承诺.

现在我正在尝试切换我的分支,但是我收到了这个错误:

    error: Your local changes to the following files would be overwritten by checkout:
    path/to/file
    Please, commit your changes or stash them before you can switch branches.
    Aborting
Run Code Online (Sandbox Code Playgroud)

我为什么用skip-worktreeINSTEAD OF assume-unchanged

我读了几个关于这个问题的SO问题,并找到了Borealid的答案.

--assume-unchanged假定开发人员不应更改文件.此标志用于提高SDK等不可更改文件夹的性能.

- 当你指示git不要触摸特定文件时, - skip-worktree非常有用,因为开发人员应该更改它.例如,如果主存储库上游托管了一些生产就绪配置文件,并且您不想意外地提交对这些文件的更改,那么--skip-worktree正是您想要的.

在此之后,我发现了Jeff的问题VonC的回答.杰夫的问题与我的问题几乎相同,我遵循了VonC的解决方案.但是这对我不起作用.也许是因为git版本的差异.因为这个问题来自2012年.我们与VonC进行了交谈,他说这是一个新问题,因为他不记得答案了.

我试图使用--assume-unchanged--skip-worktree 在一起,软正在重置worktree.但没有改变.

所以?

你能帮我解决一下我的问题吗?

谢谢.

ste*_*nks 8

我无法找到一个简洁的解决方案,所以我正在使用一个.bat文件来运行--no-skip-worktree受影响的文件.然后我stash切换分支,stash apply然后使用另一个.bat文件--skip-worktree在相同的文件上运行.

它并不好,但它是迄今为止我发现的最简单,最快捷的方式.


Ram*_*man 5

嗯,这是一个粗糙的解决方案,但似乎工作得相当好(尽管它只经过了轻微的测试):

git-checkoutsw在您的某处创建一个名为的文件PATH,其中包含以下内容:

#!/bin/bash
ignored=( $(git ls-files -v | grep "^S " | cut -c3-) )
for x in "${ignored[@]}"; do
  git update-index --no-skip-worktree -- "$x"
done
git checkout -m $@
for x in "${ignored[@]}"; do
  git update-index --skip-worktree -- "$x"
done
Run Code Online (Sandbox Code Playgroud)

该脚本捕获被忽略文件的列表,取消忽略它们,使用(用于合并)检出新分支-m以及指定的任何其他参数,然后再次忽略它们。

现在你可以git checkoutsw代替git checkout.


das*_*s-g 1

是否有理由签入该文件的空变体?如果不

git rm --cached path/to/file
echo 'path/to/file' >> .gitignore
git commit -m'stop tracking path/to/file'
Run Code Online (Sandbox Code Playgroud)

可能会解决你的问题。(必须对拥有该文件的每个分支重复此操作。或者,如果您不介意历史记录重写,git filter-branch也可以在之前的提交中删除它。)