在创建安装脚本时,我在本地克隆了几个git repos。这是通过一个临时可用的代理来完成的,该代理以后可能可用,也可能不可用,因此我需要将远程回购中的所有远程分支创建为可以切换到的本地分支。我有一种方法来提取我想要的远程回复的名称,当存储为
[user]$ nvVar=$(git branch -r | grep -v '\->' | grep -Ev 'master|spdk\-1\.6' | cut -d'/' -f2)这给了我可以迭代的变量列表,其中包含了我需要删除的分支。
[user]$ echo "$nvVar"
lightnvm
nvme-cuse
spdk如果我手动执行所有这些操作,我将使用以下命令:
[user]$ git branch --track lightnvm origin/lightnvm
Branch lightnvm set up to track remote branch lightnvm from origin.效果很好..。但是,当我试图使用shell展开循环遍历变量时,我会失败。(FYI,如果我把引号放在$nvVar周围,它不会迭代,只会尝试运行整个字符串而失败。)我还尝试使用一个数组来完成这个任务,这个数组也不起作用,我还使用了一个with循环,使用git分支-r的过滤输出)
[user]$ for i in $nvVar; do git branch --track "${i}" "origin/${i}"; done它应该生成以下git命令:
git branch --track lightnvm origin/lightnvm
git branch --track nvme-cuse origin/nvme-cuse
git branch --track spdk origin/spdk似乎与手动输入的同一命令相同。但相反,我得到了这些错误:
fatal: 'lightnvm' is not a valid branch name.
fatal: 'nvme-cuse' is not a valid branch name.
fatal: 'spdk' is not a valid branch name.这毫无意义..。
操作系统: RHEL 7.6
Git版本: 1.8.3.1
bash版本: GNU,版本4.2.46(2)-release (x86_64-redhat-linux-gnu)
(编辑)显然,我有一些特殊的字符被捕获,这些字符扰乱了命令。
有一个“^[m”被附加到捕获的变量.我真的不知道如何在不对命令进行硬编码的情况下处理这些命令,而这正是我所希望避免的。
发布于 2021-11-10 00:10:08
想出了一个解决办法:
echo '#!/bin/bash' > gitShell
git branch -r | grep -v '\->' | grep -Ev 'master|spdk\-1\.6' | cut -d'/' -f2 | while read remote; do
echo "git branch --track ${remote} origin/${remote}" >> gitShell
done
cat -v gitShell | sed 's/\^\[\[\m//g' > gitShell1
if /bin/bash -ex gitShell1; then
echo 'Git repos branched'
rm gitShell
rm gitShell1
fi我只需将输出推送到一个文件中,然后使用cat -v强制隐藏字符显示为普通字符,然后用sed过滤掉它们,然后运行新脚本。
这很麻烦,但很管用。显然,git返回“私有unicode字符”以响应远程查询。
感谢@Cyrus告诉我,我在原始变量中有隐藏的字符。
https://stackoverflow.com/questions/69905099
复制相似问题