【问题标题】:Can't add an asset from a .git folder无法从 .git 文件夹添加资产
【发布时间】:2021-08-10 14:55:41
【问题描述】:

我想检索和使用存储在 .git 文件夹(在 ORIG_HEAD 文件内)中的提交哈希。为此,我在 pubspec.yaml 文件中注册了我的资产:

flutter:
  uses-material-design: true

  assets:
    - assets/strings/
    - assets/images/
    - .git/ORIG_HEAD

使用过

await rootBundle.loadString('.git/ORIG_HEAD');

从该文件中获取值。

iOS 应用运行良好,但安卓应用抛出“无法加载资产”错误

我尝试复制 .git 文件夹并从头删除一个点。它似乎正在工作(git 文件已作为资产添加 - flutter_assets in android apk)。但是这个解决方案不是一个合适的解决方案,因为我希望在没有任何额外操作的情况下拥有相关的提交哈希。有没有解决此类问题的方法?还是只能通过添加预构建脚本来解决?

【问题讨论】:

  • 在应用程序中发布你的 git 仓库是没有用的,当然 Git 仓库默认是排除在外的。如果您将!.git/ORIG_HEAD 添加到您的.gitignore 是否有效?这将取消忽略它。可能不适用于.git 目录本身.. 但值得一试。
  • 感谢您的回答。不幸的是,它不起作用
  • 在这种情况下,我认为预构建脚本可能是最好的选择。 git info 可能会帮助您实现同样的目标?
  • 感谢@PeterKrebs 的回答。这是我选择的相同选项
  • 好的,我会发布它作为答案????????

标签: git flutter


【解决方案1】:

Gradle 具有包含 .git 目录的默认排除项。为了解决这个问题,您必须更新您的 settings.gradle 文件:

import org.apache.tools.ant.DirectoryScanner

DirectoryScanner.removeDefaultExclude('**/.git')
DirectoryScanner.removeDefaultExclude('**/.git/**')

我还更新了我的包 git_info 的文档以包含此内容。

【讨论】:

  • 谢谢。 git_info 是我尝试使用的确切包。但它不能在android平台上正常工作
  • @lesha-native 我做了那个包哈哈。它以前不工作,但我用上述步骤更新了 README 以使其工作。
【解决方案2】:

文件 .git 目录不能存储在 Git 存储库中。原因是.git 目录中的文件 Git 存储库或其中的一部分,并且任何 Git 存储库的任何部分都不能存储在 Git 存储库中。1支持>

实际问题的解决方案很简单:将哈希存储在其他地方。您将无法让 Git 自动更新它,就像“以暴力方式更改 HEAD”的 Git 命令自动更新 .git/ORIG_HEAD 的方式一样,但您可以选择何时自己手动更新。无论如何,这将是一个更好的主意,因为通过选择 想要更新哈希 ID 的时间,您在任何时候认为 错误 时都停止更新它。您对何时应该更新它的想法可能会完全符合 Git 的想法,无论是现在还是永远,但这似乎不太可能。


1Git 通过名称强制执行此操作,因此如果您重命名 .git 目录为其他名称,您可以开始存储这些文件。但是,Git 不会使用 .git 目录作为存储库——这使得 Git 可以安全地存储这些文件——因此您需要创建一个新的 .git 目录,这将是实际的存储库,现在您正在存储不属于存储库的文件。我是turtles all the way down

【讨论】:

  • 感谢您的澄清。我倾向于将哈希存储在其他地方
【解决方案3】:

不应从构建访问.git 目录。该目录并不意味着是发布的一部分,因为它是存储库本身。

您可以使用前面提到的预构建脚本。
还有一个包可以帮助您获取有关 git 存储库的信息:
git_info

来自 git_info 示例页面:

import 'package:flutter/material.dart';
import 'package:git_info/git_info.dart';

void main() {
  runApp(MyApp());
}

// This will not work unless you create a git repo in the example folder
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('git_info_example'),
        ),
        body: FutureBuilder<GitInformation>(
          future: GitInfo.get(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('Branch: ${snapshot.data!.branch}'),
                    Text('Hash: ${snapshot.data!.hash}'),
                  ],
                ),
              );
            } else {
              return SizedBox.shrink();
            }
          },
        ),
      ),
    );
  }
}

【讨论】:

    【解决方案4】:

    可能有人对存储最新提交哈希(前 7 个字符)的附加脚本感兴趣

    success="\033[32mThe latest commit hash has been successfully stored in
    enter code hereassets:"
    error="\033[31mError during saving latest commit hash in assets, the app might not work properly"
    outputFile=assets/build-info/commit-hash
    
    (
      head=$(<.git/HEAD) &&
      ref=$(echo $head | cut -d' ' -f2) &&
      hash=$(<.git/$ref) &&
      echo ${hash:0:7} > $outputFile &&
      echo -e "$success $(<$outputFile)"
    ) || echo -e $error
    

    将此代码保存在 .sh 文件下并在运行“run”或“build”之前执行它。带有提交哈希的文件将存储在“outputFile”路径下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-20
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多