我在上有一个地方改变一个Git仓库的文件。 我想有混帐忽略局部变化永远,而不是文件。 特别是,
- 如果文件不是除了这个变化所感动,
git add .
不应该阶段,。 - 同样,
git commit -a
不应该提交。 - 如果我对该文件进行额外的变化,我应该可以暂存并提交这一变化-但我忽略了的变化不应该被演出和承诺。
有没有办法做到这一点? 做一些研究,我读到“污迹/清洁周期,”在那里,如果我正确地读出,
- 该文件将被标记为不变,
- 当我结帐我所做的更改将被覆盖,
- 然后脚本将自动重新应用更改,然后再次将文件标记为不变。
我很新的Git和脚本,但(我用C#和Java经验的实习生),因此,如果这就是我需要做的,你可以请张贴详细的指导或链接到一个教程如何设置污迹/清洁周期吗?
背景:我希望我的工作分支出来与主干同步。 有一个低优先级的错误,不仅影响开发机器,因此而不是修复它,我们只是注释掉有问题的代码。 很显然,我们不希望从生产,它工作得很好删除此代码。
Answer 1:
在我看来,你所描述的情况是这样的:你想保持这是从本地存储库不同的工作目录。
这是不可取的; 因为这些变化都不敢承诺,你会毫无办法,如果一个文件被你不想办法意外删除或更改。
因此,建议您在事实上提交所有更改。 如果你想这些变化分开,你可以轻松地用一个分支。 例
git checkout -b new-branch
# now you can change the file without affecting master
echo bar >> foo
git add
git commit
# and back to master
git checkout master
Answer 2:
您可以使用skip-worktree
位。 打开它用:
git update-index --skip-worktree <file>
在此之后,git会永远舞台本地更改<file>
和会失败(大声地)如果混帐本身具有写入<file>
(比方说,在合并或结账)。
如果你想上演一场未来的变化,你可以关闭它,舞台上的新变化,然后重新打开它:
git update-index --no-skip-worktree <file>
git add -p <file>
git update-index --skip-worktree <file>
虽然并不完美,这可能是不够好。 这将是由你来发现<file>
具有不分阶段的变化,因为git会不再告诉你,
注:我原来的建议是,使用assume-unchanged
。 正如上文Git的- “假设未发生变化”和“跳过worktree”之间的区别 ,它是真正skip-worktree
你想要的。 具体而言, assume-unchanged
是到Git,你不会更改文件承诺,如果你违反该承诺的Git允许你删除或修改提交他们! 相比之下,Git会不会删除或提交您的skip-worktree
变化。
Answer 3:
Git的“补丁模式”是完美的从文件中添加只有某些更改您的承诺。
要启动它,请键入git add -p
, git commit -p
(完成后直奔提交信息),或git add --interactive
(更多的提示)。
它本质带你穿越的显示每段代码git diff
,并询问您是否要上演与否。
当你到达的变化,无论是回答N 2 O,或E要在$编辑器中打开补丁。
Answer 4:
注:其他人说,保持持久化的局部变化是一个坏主意,我没有任何理由不同意。 考虑其他的选择。
下面是我喜欢的方法:
- 请你要保持你的本地计算机上的一些变化。
- 使用
git branch local
和git checkout local
做一个新的分支为你的本地修改。 (如果我没有记错的话,这些命令将不设置远程分支自动的,所以新的分支将不会推。) - 使用
git commit
提交更改。 - 创建要推动上游的变化。
- 使用
git checkout parent
回去,你要推的分支。 - 使用
git commit
提交给该分支。 - 使用
git push
来推你的变化。 - 使用
git checkout local
,回到当地分行。 - 使用
git rebase parent
把从改变parent
到local
。 使用rebase
将使使你的局部变化保持在在变化上面parent
。 - 回到步骤4,重复生厌。
有了这个,你不必手动告诉混帐其变化是局部的,要进行非本地的变更都的人都没有。
Answer 5:
这些回答都不错,但可能无法最有效地解决@凯文的问题。 我也有类似的担忧,经常编辑配置文件,因此该应用我正在将访问我自己的私人发展数据库,而不是生产一。 这只是一个时间的问题之前,我不小心检查,推动这些配置的变化! 我只是需要一个重量轻的办法忽略的文件。 下面是我学到了什么:
首先,将你需要改变你的文件。 我称之为my_config
。
请与该改变的补丁文件git diff >../somewhere-else/my_config.patch
现在告诉混帐忽略该文件(而无需更改签入的.gitignore): git update-index --assume-unchanged my_config
现在,只要你不更改my_config
, 你要检查,你可以自由地工作。 要停止忽略my_config
,做git update-index --no-assume-unchanged my_config
。 在别人的变化拉到后my_config
,你可以轻松地恢复你的私人变化git apply ../somewhere-else/my_config.patch
,然后......假设未发生变化再次,如上所述,并回去工作!
以下是你可以把一些有用的别名,你的~/.gitconfig
:
[alias]
unchanged = update-index --assume-unchanged
changed = update-index --no-assume-unchanged
show-unchanged = !"git ls-files -v | sed -e 's/^[a-z] //p; d'"
Answer 6:
是的,这也许可以用涂抹/清洁过滤器来完成。 然而,我强烈建议反对这样做,因为这将是相当复杂且容易出错(例如,它会混淆了许多工具上git的建设,这将使问题很难调试等)。
此外,一般不具有永久性的局部变化是一个好主意。 使用单片机的一个很重要的一点是,你可以检出一个版本,它立刻工作。 这意味着,你需要的一切应该进行检查。
我不认为有任何“好”的方式做到这一点,既不用git也可能与其他大多数供应链管理系统。 我建议你重新考虑你的要求。
这个问题似乎是,你有“混合内容”文件:(?机专用选项)的部分内容始终是相同的,有的需要进行局部改变。 处理这种推荐的方法是不是有问题的文件进行检查,而是在一个“模板”文件检查,然后生成在构建时真正的文件。 尝试调查这个。 这将是更多的工作,现在(可能),但会使事情变得更容易,特别是如果你需要支持更多的变化或者如果其他人想在同一项目上工作。
编辑(根据您的评论信息)
你写,你要忽略本地代码更改,只为开发机器必要的,但不是在生产。
在这种情况下,而不是注释掉,包裹代码某种条件,使其只在开发机器上运行(例如,使用条件编译,或者读一个配置文件或某些环境属性,或...(1 ))。 然后你就可以在代码检查正常。
更妙的是,刚刚修复bug。 如果一个bug使得开发难度,那么恕我直言,这是高优先级。
只是注释掉的代码是不是一个好主意。 这是容易出错,并在每次检查时必须做到的。 首先,在研发和生产中运行不同的代码是自找麻烦,应该尽量避免。
(1)作为一个例子:在我们公司,我们有一个环境变量专门针对这样的情况下。 这表明该代码是否在运行,开发,在beta测试,或生产,并通过我们的构建和部署脚本设置。 然而,它通常只用于像选择不同的文件路径简单的事情。 基于环境变化的程序逻辑气馁,如上所述。
Answer 7:
如果你需要在同一个文件并行的变化(如您的意见中),你不能使用的.gitignore那么一种选择是git的添加-p使用此您可以添加或相应跳过。
这里使用上述的git命令的问题是,这将是更手动过程的。 我想你可能找不到你问题的任何其他自动化的方法。
Answer 8:
正如吉特2.5(2015年7月),你可以使用git的worktree :
git worktree add -b patch-1 ../patch-1
这本质上只是创建分支,但是它把新的分支到一个新的文件夹旁边的母公司回购。 这是很好的,因为你可以在这个分支做的工作,即使没有提交,然后用干净的工作目录切换回主。
Answer 9:
如果你碰巧使用的IntelliJ作为IDE,那么它有一个很棒的功能(变更列表),我认为不正是OP请求。
您可以标记并命名您的本地差异的特定部分。 如果没有记错,这将让这些变化从所有其他本地修改分离,将只上演承诺,如果你主动选择这样做的 - 只要你做你的IntelliJ从犯。
文章来源: Ignore specific changes to a file in git, but not the entire file