Git 命令行踩坑笔记

最近在写打包流水线的时候,遇到了几个坑,稍微总结一下。

远程分支存在则拉取,不存在则checkout

全量拉取

1
2
3
4
5
6
7
8
9
10
11
12
git clone -b master "${git_url}" "${products_dir}"
cd "${products_dir}"
if [ "git branch -r | grep $branch" ]; then
echo "remote $branch existed"
git fetch --all
git switch -c "${branch}" "origin/${branch}"
git pull
else
echo "remote $branch not existed"
git checkout -b "${branch}"
git push -u origin "${branch}"
fi

这里有个坑需要注意,就是克隆的时候不能使用--depth=1,这样会导致以后只能拉取到该分支的信息,其他分支你怎么检查都是不存在的

但是有时侯我们的仓库太大了,我们就是想要拉取该分支的最新版本怎么办,能拉成功就拉成功,拉不成功就创建分支。

听起来没问题,但是如果直接写,你就会遇到问题,就是拉不成功整个shell就退出了,那么有没有办法解决呢?

有办法,有两种办法,第一种,使用subprocess

subprocess尝试拉取最新版本

1
2
3
4
5
6
7
8
9
git_clone=$(git clone--depth=1 -b "${branch}" "${git_url}" "${products_dir}")
if [[ -z ${git_clone} ]]; then
echo "remote $branch existed"
else
echo "remote $branch not existed"
git clone--depth=1 -b master "${git_url}" "${products_dir}"
git checkout -b "${branch}"
git push -u origin "${branch}"
fi

$()内部的就是subprocess,它的失败不会导致shell直接退出

set +e

在shell的头部设置set +e,保证失败不退出,然后检查命令是否执行成功

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
set +e

git clone --depth=1 -b "$branch" "${git_url}" "${products_dir}"
if [[ $? -ne 0 ]]; then
echo "remote $branch not existed"
git clone--depth=1 -b master "${git_url}" "${products_dir}"
git checkout -b "${branch}"
git push -u origin "${branch}"
else
echo "remote $branch existed"
fi

$? 的意思是获取上一条指令的执行结果,如果结果为0则表示成功。

如果仓库使用了lfs,最好使用git lfs命令

就是说如果你的仓库使用了lfs,那么,尽量使用git lfs clone,而不是git clone,其他命令同理

android:requestLegacyExternalStorage not found

如果你在打包APK过程中遇到了这样的报错:AAPT: error: attribute android:requestLegacyExternalStorage not found.

当项目build.gradle - compileSdkVersion配置的版本小于29,并且还在AndroidManifest.xml - application中配置了android:requestLegacyExternalStorage属性(不管是自己项目还是三方库配置了这个属性),就会导致这个问题的产生。
这个属性主要作用是因为Android 10.0的存储权限调整,Google推出的临时解决方案。

这个博客上介绍了两种解决方法:https://juejin.cn/post/6850418117093523464

不过这两种方法不适用于我们的情况,因为我们是直接产生APK的,没有办法暂停下来操作中间的Gradle产物,当然我们可以说先打包Gradle项目出来,再构建APK

不过Unity官方提供了方法,我们可以定义中间Gradle产物的AndroidManifest.xml,这里分两种,一种是定义unityLibrary的,一种是定义launcher的,我们采取第二种

然后将生成的Assets/Plugins/Android/LauncherManifest.xml改成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>

<application android:extractNativeLibs="true"
android:label="@string/app_name"
android:icon="@mipmap/app_icon"
tools:remove="android:requestLegacyExternalStorage"/>
</manifest>

主要就是在application标签中添加tools:remove="android:requestLegacyExternalStorage"