我有一个包含敏感数据的文件,因此我不想将此文件的内容推送到远程服务器。
为了实现这一点,我在文件为空时进行了提交,并将此空文件推送到服务器(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
skip-worktree
进入assume-unchanged
?我读了几个关于这个主题的SO问题,并找到了Borealid's answer。
- 假设未更改假定开发人员不应更改文件。此标志用于提高SDK等不可更改文件夹的性能。
- 当你指示git不要触摸特定文件时,skip-worktree非常有用,因为开发人员应该更改它。例如,如果主存储库上游托管了一些生产就绪配置文件,并且您不想意外地提交对这些文件的更改,那么--skip-worktree正是您想要的。
在此之后,我找到了Jeff's question和VonC's answer。杰夫的问题与我的问题几乎相同,我遵循了VonC的解决方案。但是这对我不起作用。也许是因为git版本的差异。因为这个问题来自2012年。我们与VonC进行了交谈,他说这是一个新问题,因为他记不起答案了。
我尝试将--assume-unchanged
和--skip-worktree
一起使用,并软重置工作树。但没有改变。
你能帮我解决一下我的问题吗?
谢谢。
答案 0 :(得分:5)
我无法找到一个简洁的解决方案,因此我使用.bat
文件在受影响的文件上运行--no-skip-worktree
。然后我stash
,切换分支,stash apply
,然后使用另一个.bat
文件在相同的文件上运行--skip-worktree
。
这不好,但这是迄今为止我发现的最简单,最快捷的方式。
答案 1 :(得分:2)
是否有理由检查该文件的空变体?如果不是
git rm --cached path/to/file
echo 'path/to/file' >> .gitignore
git commit -m'stop tracking path/to/file'
可能会解决您的问题。 (对于拥有该文件的每个分支都必须重复。或者如果您不介意重写历史记录,请使用git filter-branch
在之前的提交中删除它。)
答案 2 :(得分:1)
你可以enable sparse checkout and add the file there同时添加skip-worktree标志(如果你单独添加稀疏结账,它可能会被删除)。
要排除您应该放入稀疏结帐文件的文件(请参阅git-read-tree手册):
/*
!unwanted
然后在更新时不会触及它(因此你没有得到其他分支的内容,而是保留你的编辑)。它可能不是你想要的。
答案 3 :(得分:1)
好吧,这是一个粗糙的解决方案,但似乎工作得还不错(尽管只是经过了严格的测试):
在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
该脚本捕获被忽略文件的列表,将其忽略,然后使用-m
(用于合并)和指定的任何其他参数检出新分支,然后再次忽略它们。
现在您可以执行git checkoutsw
而不是git checkout
。
答案 4 :(得分:0)
到目前为止,--assume-unchanged和--skip-worktree不能正常工作。我的git版本是:git版本2.8.4(Apple Git-73)Stash是到目前为止唯一有效的方法。
答案 5 :(得分:0)
只需找到一行就可以对所有文件执行--no-skip-worktree
git ls-files -v | grep "^S" | cut -c 3- | xargs -L1 git update-index --no-skip-worktree
您可以使用该命令轻松地创建一个别名:unhideall:)
答案 6 :(得分:-1)
我遇到了同样的问题,它被归结为由我想要假设的文件上的传入更改来保持不变。
所以,如果我对文件不做任何假设 - 保持不变,请将其存放,检查最新版本,弹出我的存储,并再次假设未更改。
所以现在我可以再次切换分支。