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 write tree
    将临时索引的内容保存为git存储库中的树对象
  • 第四,
    git stash
    将树对象与
    HEAD
    进行比较,以确保您确实选择了要隐藏的内容
  • 最后,
    git stash
    删除它创建的临时索引文件