只是好奇 Git 是否有类似 Subversions Changelist 的功能,我觉得它在飞行中使用非常方便,我知道我可以运行类似的东西:
cat 'changelistfileimade' | xargs git update
但是我很好奇是否也有内置方法?
我为此搜索了更多内容,我想我已经找到了我在上面的评论中提到的 TortoiseSVN ignore-on-commit
changelist 用例的替代品。有问题的命令是 git update-index --assume-unchanged <path/name>
。Git 帮助对此有这样的说法:
--[否]假设不变
指定这些标志时,不会更新为路径记录的对象名称。相反,这些选项设置和 取消设置路径的"假设不变"位。当"假设不变"位打开时,Git 停止检查工作 树文件以进行可能的修改,因此您需要手动取消设置位以在更改工作树时告诉 Git 文件。当在 lstat(2( 系统调用速度非常慢的文件系统上处理大型项目时,这有时很有帮助 (例如 CIFS(。
此选项还可以用作粗略的文件级机制,以忽略跟踪文件中未提交的更改(类似于 .gitignore 对未跟踪文件的作用(。Git 将失败(优雅地(,以防它需要在索引中修改此文件 例如,在提交中合并时;因此,如果假设未跟踪的文件在上游发生更改,您将需要处理 情况手动。
我在Nick Quaranto的GitReady博客上找到了该选项的解释,其中包括以下内容:
显然,有很多警告与此有关。如果直接
git add
文件,则会将其添加到索引中。合并带有此标志的提交将导致合并正常失败,因此您可以手动处理它。
但这对我来说只是成功的一半。下一步是知道你忽略了什么(并希望记住为什么(。这是Abe Voelker对一个恰当命名的问题的方便评论提供的。只需使用代码段编辑您的.gitconfig
文件
[alias]
ignored = !git ls-files -v | grep "^[[:lower:]]"
如果文件中已存在 [alias]
位,请不要添加该位。现在git ignored
会告诉你这样的事情:
h configs/environment/local.php
h configs/logging/log4php.xml
您可以使用以下行使用ignore
和unignore
别名更进一步:
ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
我自己从未使用过SVN变更列表,但是如果我理解正确,它允许您将文件分组到变更列表中,然后分别提交这些变更列表。(对吧?
我认为你真的不需要 Git 的这样一个功能。您已经可以单独暂存(git add
(每个文件或其部分(git add -p
(并提交它们。您可以为每个变更列表创建分支,然后合并/变基这些分支。或者,您可以创建多个提交,然后使用交互式变基(git rebase -i
(对它们重新排序。
代替svn diff --changelist something
,您只需使用 git show changelistbranch
。
您不必推送这些本地/临时分支。没有人需要看到它们,直到你认为它们准备好被释放到野外。
您甚至可以为"变更列表分支"命名:git branch changelist/name_of_your_changelist
,然后您将按前缀对所有变更列表进行分组。
我错过了什么吗?