【问题标题】:Show git last commit hash and current branch/tag in flutter app在 Flutter 应用程序中显示 git 上次提交哈希和当前分支/标签
【发布时间】:2021-01-01 10:41:00
【问题描述】:

在构建 Flutter 应用程序时,如何从源目录访问最后一个 git 提交哈希、当前分支和最后一个标记?我想在“关于版本”对话框中显示它。

https://pub.dev/packages/package_info,但没有关于git的信息。

是否有任何其他软件包可以提供此信息?

【问题讨论】:

  • 所以如果我理解正确,您是否尝试显示应用版本?
  • @ETCasual 不,我想显示类似“这个版本是从 git commit a8b07e02 (branch: master) 构建的,标签 'release-0.8-rc1' 后面的 8 个提交”。
  • 不完全确定如何解决这个问题,但我建议编写一个 webhook / API 来获取提交哈希?

标签: flutter dart


【解决方案1】:

这可能不是最好的解决方案,但我就是这样做的。

1。将必要的文件添加到资产

flutter:
  assets:
    - .git/HEAD         # This file points out the current branch of the project.
    - .git/ORIG_HEAD    # This file points to the commit id at origin (last commit id of the remote repository).
    - .git/refs/heads/  # This directory includes files for each branch which points to the last commit id (local repo).

2。从您的 .dart 代码中使用它

Future<String> getGitInfo() async {
  final _head = await rootBundle.loadString('.git/HEAD');
  final commitId = await rootBundle.loadString('.git/ORIG_HEAD');

  final branch = _head.split('/').last;

  print("Branch: $branch");
  print("Commit ID: $commitId");

  return "Branch: $branch,  Commit ID: $commitId";
}

3。如果需要,在你的 Flutter 应用中显示它

FutureBuilder<String>(
  future: getGitInfo(),
  builder: (context, snapshot) {
    return Text(snapshot.data ?? "");
  },
)

预期输出:

请注意,hot reload works also for assets,因此它应该显示更改。

【讨论】:

  • 这适用于 iOS 但不适用于 Android。可能是什么问题?
  • 不确定,我记得在 android 上测试过这个并发布了输出截图。它应该以相同的方式在任何平台上工作,因为它只依赖于资产文件,而资产文件不是特定于平台的。
  • @MohdShahid 请参阅this 答案以获取解决方案。
【解决方案2】:

Rithvik Nishad 的回答对我不起作用,因为我的 Flutter 项目是子项目,无法访问 .git/ 目录。例如:

root/
|__.git/
|__client/
|_____flutter project/  <== can not access to .git/ from here

所以我的解决方案是使用一个小脚本来获取 git 信息并保存到 .env 文件中

#!/bin/bash
set -e

branch=`git rev-parse --abbrev-ref HEAD`
escaped_branch=$(printf '%s\n' "$branch" | sed -e 's/[\/&]/\\&/g')
commit=`git rev-parse --short HEAD`

# branch
if grep -q 'GIT_BRANCH=' .env; then
    sed -i '' "s/^GIT_BRANCH.*/GIT_BRANCH=$escaped_branch/g" .env
else
    echo "GIT_BRANCH=$branch" >> .env
fi

# commit hash
if grep -q 'GIT_COMMIT=' .env; then
    sed -i '' "s/^GIT_COMMIT.*/GIT_COMMIT=$commit/g" .env
else
    echo "GIT_COMMIT=$commit" >> .env
fi

然后读取.env文件以获取git分支/哈希,...(我正在使用dotenv读取文件)

final gitBranch = dotenv.env['GIT_BRANCH'] ?? ''; // => features/change-logo
final gitCommit = dotenv.env['GIT_COMMIT'] ?? ''; // => 45a97d3

这是我的结果:

【讨论】:

    【解决方案3】:

    我的方法不需要其他包、环境变量或添加和读取资产。并支持flutter项目在任何子目录中。直接用post-commit git hook 写一个.dart 文件:

    # post-commit
    FILE="app/lib/such/a/deep/tree/settings/git.dart"
    echo "// AUTO GENERATED FILE BY GIT HOOK post-commit" > $FILE
    echo "const String GIT_COMMIT = '$(git rev-parse HEAD)';" >> $FILE
    echo "const String GIT_BRANCH = '$(git rev-parse --abbrev-ref HEAD)';" >> $FILE
    

    然后:

    import 'package:fluffy-squirrel/settings/git.dart';
    
    print(GIT_BRANCH);
    

    这是我确保我的 Sentry 实例始终具有正确版本的方法。

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2013-04-28
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2013-01-13
      • 2012-02-06
      • 2010-10-31
      相关资源
      最近更新 更多