uci - 如何恢复所有未暂存的更改

问题描述 投票:0回答:5

uci
文档说:

所有“

uci set
”、“
uci add
”、“
uci rename
”和“
uci delete
”命令都暂存到临时位置,并使用“
uci commit
”立即写入闪存。

如果我做对了,您首先运行一些类似于上面提到的命令,并将更改写入您运行的配置文件中

uci commit
。例如,假设我做了以下更改...

root@OpenWrt:~# uci changes
network.vlan15.ifname='eth1.15'
network.vlan15.type='bridge'
network.vlan15.proto='static'
network.vlan15.netmask='255.255.255.0'
network.vlan15.ipaddr='192.168.10.0'

...但我不想继续并承诺它们。有没有一种简单的方法可以恢复所有分阶段的更改并避免逐一执行?

openwrt
5个回答
5
投票

这应该可以通过以下命令实现:

root@firlefanz:~# rm -rf /tmp/.uci/

3
投票

有一个命令可以恢复所有分阶段的更改

revert  <config>[.<section>[.<option>]]     Revert the given option, section or configuration file.

所以,就你而言,应该是

uci revert network.vlan15

参见https://openwrt.org/docs/guide-user/base-system/uci


2
投票

这句话应该可以解决问题:

uci changes | sed -rn 's%^[+-]?([^=+-]*)([+-]?=.*|)$%\1%' | xargs -n 1 uci revert

tl;dr sed 命令从暂存的更改中提取选项名称。 xargs 命令对每个提取的选项执行恢复命令。

现在让我们深入了解一切:

uci changes
打印准备好的更改,然后将其通过管道传输到 sed 命令。

sed 选项

-r
启用扩展正则表达式并
-n
抑制模式匹配的自动打印。

sed 命令

s
用于执行搜索和替换,
%
用作搜索和替换术语的分隔符。

uci 换乘线路有不同的格式。

删除的配置选项带有前缀

-
。 添加的配置选项带有前缀
+
更改的选项没有前缀。

为了匹配前缀

[+-]?
使用。问号表示方括号中的字符之一可以是可选匹配的。

选项名称将与模式

[^=+-]*
匹配。该正则表达式具有任意数量的字符的含义,只要该字符不是
=+-
之一。 它位于圆括号内,将其标记为组以便稍后重复使用。

下一个模式([+-]?=.*|)也是一个模式组。管道中吐出两个不同的组。 第二部分很简单,根本没有任何性格。当删除 uci 选项时会发生这种情况。 第一部分意味着字符

=
可以选择在前面加上
+
-
=
之后可以是一个或多个字符,用
.*
表示。
=<value>
发生在添加的配置上。前置
-
+
表示该值已从列表中删除或添加到列表(如果选项是列表)。

在替换模式中,整行被其引用

\1
替换为第一组。换句话说:仅打印选项名称。

所有选项名称都会发送到 xargs。使用选项

-n  1
xargs 对 sed 发送的每个
uci revert <option_name>
执行
option_name

这是

uci changes
输出的不同格式的一些示例:

-a
+b='create new option with this value'
c='change an existing option to this value'
d+='appended to list'
e-='removed from list'

提取的选项名称如下:

a
b
c
d
e

xargs -n 1 
然后将执行以下命令:

uci revert a
uci revert b
uci revert c
uci revert d
uci revert e

这就是一句台词的全部魔力。


1
投票

我没有找到

uci
命令来恢复所有未提交的更改,但您可能可以使用一些 shell 脚本来解析
uci changes
命令的输出,以实现所需的结果。这是一个示例脚本:

#!/bin/ash

# uci-revert-all.sh
# Revert all uncommitted uci changes

# Iterate over changed settings
# Each line has the form of an equation, e.g. parameter=value
for setting in $(uci changes); do

    # Extract parameter from equation
    parameter=$(echo ${setting} | grep -o '^\(\w\|[._-]\)\+')

    # Display a status message
    echo "Reverting: ${parameter}"

    # Revert the setting for the given parameter
    uci revert "${parameter}"
done

更简单的替代方法可能是使用

uci revert <config>
语法,例如:

#!/bin/ash

# uci-revert-all.sh
# Revert all uncommitted uci changes

for config in /etc/config/*; do
    uci revert $(basename ${config})
done

这两种方法在运行 LEDE 4 的路由器上都很适合我。


0
投票

这是另一个简短的行话来恢复所有未分阶段的更改(根据问题):

for i in /etc/config/* ; do uci revert ${i##*/} ; done

请注意,这将恢复每个配置文件的所有更改。

@BMC 提出了一项改进:仅恢复自上次启动以来修改过的文件的更改:

for i in /tmp/.uci/* ; do uci revert ${i##*/} ; done

(仅供参考,这使用 posix 参数扩展 的“删除最大前缀模式”。)

© www.soinside.com 2019 - 2024. All rights reserved.