2017-11-11 117 views
1

我已经为我的应用程序一起更新了更新程序,以便具有很少或没有编码技能的人员可以在自己的计算机上安装,运行和更新应用程序。为什么我不应该使用这个瓷器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命令会永远当有一个干净的工作目录时,返回东西

所以我的问题是:在这个特定的用例中使用瓷器是错误的吗?如果是这样,为什么?

奖励:有什么更好的方法来解决这个问题?

回答

1

实际上,使用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替代。

+0

这很有启发。我仍然困惑,为什么他们开关' - 瓷器',当它的意图是在这个更加管道导向的情况下使用。 – Bango

+1

@Bango,很多git命令都有'--porcelain'开关,只是为了说明使用这个开关时它们提供了稳定的输出。 – Opal

1

git status --porcelain不是一个瓷器命令。该选项的名称具有误导性,但实际上它的意思是“给出一个容易分析和稳定的输出,适用于瓷器剧本”。因此,--porcelain意味着“充当管道命令”。

正如在另一个答案中已经说过,你做什么都没有错,--porcelain是为了用你的方式使用。

相关问题