git stash中的shell脚本是什么意思?它是如何工作的?
我在git stash中的shell脚本是什么意思?它是如何工作的?,git,bash,shell,sh,git-stash,Git,Bash,Shell,Sh,Git Stash,我在git stash rm -f "$TMP-index" && GIT_INDEX_FILE="$TMP-index" git read-tree HEAD && # find out what the user wants GIT_INDEX_FILE="$TMP-index" \ git add--interactiv
git stash
rm -f "$TMP-index" &&
GIT_INDEX_FILE="$TMP-index" git read-tree HEAD &&
# find out what the user wants
GIT_INDEX_FILE="$TMP-index" \
git add--interactive --patch=stash -- &&
# state of the working tree
w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
die "$(gettext "Cannot save the current worktree state")"
git diff-tree -p HEAD $w_tree -- >"$TMP-patch" &&
test -s "$TMP-patch" ||
die "$(gettext "No changes selected")"
rm -f "$TMP-index" ||
die "$(gettext "Cannot remove temporary index (can't happen)")"
我不明白的是这样的表达:
GIT_INDEX_FILE="$TMP-index" git read-tree HEAD
这是否意味着将TMP index
的值分配给GIT_index_文件
,然后执行命令GIT read tree HEAD
我不确定。所以我试着写一个类似的命令
A="1" ls
echo $A
A
的值仍然是null
我也试过:
echo $a
=> 1
k=$(a=100 echo $a)
=>
echo $k
=> 1
看来a
的值根本没有改变。因此,a=100
似乎没有用
有人对这样的语法有想法吗?你的问题“这是否意味着…”的答案是是 但是,在解析命令时会发生变量扩展,这对于查看设置环境变量然后将其导入shell的结果来说还为时过早,这就是您无法获得预期结果的原因 有多种方式可以查看单行环境变量表达式的结果;你可以观察到
$ B=100 env | grep B
B=100
……或者
$ z=abc sh -c 'echo $z'
abc
在BASH中,定义一个变量并随后运行一个新进程存在一些问题 如果您只是定义变量,它不会被新流程“继承” 让我们定义一个变量
$ VAR='value'
$ echo $VAR
value
然后进入一个新的过程
$ bash
变量未定义
$ echo $VAR
$
但一旦我们回来
$ exit
再次定义var
$ echo $VAR
value
$
通常的解决方法是使用导出
$ export VAR2='yep'
$ bash
$ echo $VAR2
yep
$
您看到的(似乎)是另一种语法,它在子进程中分配变量,而不是在原始进程中
$ var3='wow' bash #this line opens a new bash, and assigns the variable for this new bash
$ echo $var3
wow
$ exit
$ echo $var3
$
这是否意味着将TMP index
的值分配给GIT_index_文件
,以及
然后执行命令git read tree HEAD
不完全是。语法:
VAR1=val1 VAR2=val2 somecommand arg1 arg2
告诉shell使用参数arg1
和arg2
执行命令somecommand
,但是somecommand
的环境将VAR1
设置为val1
并且VAR2
设置为val2
。shell本身不受这些赋值的影响,只受somecommand
环境的影响。其效果相当于:
env VAR1=val1 VAR2=val2 somecommand arg1 arg2
唯一的区别是前一种方法不需要查找和执行/usr/bin/env
实用程序(我假设env
不是一个shell内置实用程序),因此速度更快
这也相当于:
(导出VAR1=val1 VAR2=val2;somecommand arg1 arg2)
注意括号——这会导致shell在单独的子shell中执行命令。子shell结束时,对子shell的任何更改(如变量赋值)都不会持续
例子
#/垃圾箱/垃圾箱
FOO=value1
printf%s\\n“在shell中,FOO是${FOO}(在运行python之前)”
FOO=value2python-c'导入操作系统;打印“在python中,FOO是”,os.environ[“FOO”]
printf%s\\n“在shell中,FOO是${FOO}(在运行python之后)”
上述脚本打印以下输出:
shell中的FOO是value1(在运行python之前)
在python中,FOO是value2
在shell中,FOO是value1(在运行python之后)
Git在做什么
在您提供的Git shell代码片段中,Git stash
正在临时更改Git_INDEX_文件
,以便调用Git
,以便stash
可以执行一些索引变异操作,而不会弄乱索引:
- 首先,
使用git stash
创建临时索引文件,并将其内容初始化为git read tree
中的任何内容HEAD
- 其次,
使用git stash
询问用户要隐藏哪些部分,并将所选更改保存在临时索引文件中git add--interactive
- 第三,
使用git stash
将临时索引的内容保存为git存储库中的树对象git write tree
- 第四,
将树对象与git stash
进行比较,以确保您确实选择了要隐藏的内容HEAD
- 最后,
删除它创建的临时索引文件git stash