为什么我不应该使用这个瓷器Git命令来判断我的回购是否有任何变化?
我已经为我的应用程序一起更新了更新程序,以便具有很少或没有编码技能的人员可以在自己的计算机上安装,运行和更新应用程序。为什么我不应该使用这个瓷器Git命令来判断我的回购是否有任何变化?
下面是一个更新的例子,对于Windows命令提示符写:
@echo off
for /f %%i in ('call git status --porcelain') do set stash=%%i
if not [%stash%] == [] (
echo Stashing local changes...
call git add .
call git stash -q
)
echo Updating App...
call git pull origin master
if not [%stash%] == [] (
echo Restoring local changes...
call git stash apply -q
)
echo Updating Dependencies...
call npm update
echo Done
pause
正如你所看到的,我打电话git status --porcelain
告诉应用程序是否有需要被藏匿的局部变化在拉远程主分支之前。
此命令将返回什么如果工作目录是干净的,但总是会返回东西如果有局部变化,跟踪或以其他方式。
我从其他SO帖子看到,使用瓷器命令在git中进行管道工作是不好的,但在这种情况下,它对我来说效果很好,而且我也不明白为什么git status --porcelain
命令会永远当有一个干净的工作目录时,返回东西。
所以我的问题是:在这个特定的用例中使用瓷器是错误的吗?如果是这样,为什么?
奖励:有什么更好的方法来解决这个问题?
实际上,使用git status
与--porcelain
开关没有什么不对。此外,当您窥视文档时,您将看到您完全按照其设计的方式使用该命令:
为脚本提供易于解析格式的输出。这是类似于短输出的 ,但在Git 版本中将保持稳定,并且与用户配置无关。详情请参阅下文。
这里的另一个选择是使用-s
开关(git status -s
),这也将返回容易解析输出,但它可能无法得到保证,以备将来的版本相同的方式工作。
我觉得git status
这个特殊用法在任何方面都不正确。它完成这项工作,它可靠并且易于理解。
与瓷器相同的命令可以例如是:
git ls-files --exclude-per-directory=.gitignore --exclude-from=.git/info/exclude --others --modified -t
但从git ls-files
文档上-t
开关:
此功能是半弃用。对于脚本的目的, git-status(1) - 瓷器和git-diff-files(1) - 名称状态差不多 总是优于 的替代品,用户应该看一下git-status(1) - short或git-diff(1) - 名称状态以获得更多用户友好的选择。
所以你看到,即使git手册建议使用git status
替代。
git status --porcelain
不是一个瓷器命令。该选项的名称具有误导性,但实际上它的意思是“给出一个容易分析和稳定的输出,适用于瓷器剧本”。因此,--porcelain
意味着“充当管道命令”。
正如在另一个答案中已经说过,你做什么都没有错,--porcelain
是为了用你的方式使用。
这很有启发。我仍然困惑,为什么他们开关' - 瓷器',当它的意图是在这个更加管道导向的情况下使用。 – Bango
@Bango,很多git命令都有'--porcelain'开关,只是为了说明使用这个开关时它们提供了稳定的输出。 – Opal