首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git-stash中的shell脚本是什么意思,它是如何工作的?

git-stash中的shell脚本是什么意思,它是如何工作的?
EN

Stack Overflow用户
提问于 2012-12-31 13:32:54
回答 3查看 540关注 0票数 1

我在git-stash中看到过这样的代码片段

代码语言:javascript
复制
            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)")"

我不明白的是这样的表达:

代码语言:javascript
复制
GIT_INDEX_FILE="$TMP-index" git read-tree HEAD

这是否意味着将TMP-index的值赋给GIT_INDEX_FILE,然后执行命令git read-tree HEAD

这一点我不太确定。所以我试着写一个类似的命令,如下所示。

代码语言:javascript
复制
A="1" ls
echo $A

A的值仍然是null

我还尝试了这个:

代码语言:javascript
复制
echo $a
=> 1
k=$(a=100 echo $a)
=> 
echo $k
=> 1

看起来a的值根本没有改变。所以a=100看起来没用..

有没有人对这样的语法有想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-01 01:33:00

是否意味着将TMP-index的值赋给GIT_INDEX_FILE,然后执行命令git read-tree HEAD

不完全是。语法:

代码语言:javascript
复制
VAR1=val1 VAR2=val2 somecommand arg1 arg2

告知shell使用参数arg1arg2执行命令somecommand,但somecommand的环境将VAR1设置为val1VAR2设置为val2。shell本身不会受到这些赋值的影响,只受somecommand的环境影响。效果相当于:

代码语言:javascript
复制
env VAR1=val1 VAR2=val2 somecommand arg1 arg2

唯一的区别是,前一种方法不需要查找和执行/usr/bin/env实用程序(我假设env不是一个外壳内置实用程序),因此它的速度要快得多。

它也等同于:

代码语言:javascript
复制
(export VAR1=val1 VAR2=val2; somecommand arg1 arg2)

请注意括号--这会导致shell在单独的子shell中执行命令。对子subshell所做的任何更改(例如变量赋值)在该子subshell结束时都不会保留。

示例

代码语言:javascript
复制
#!/bin/sh
FOO=value1
printf %s\\n "In the shell, FOO is ${FOO} (before running python)"
FOO=value2 python -c 'import os; print "In python, FOO is", os.environ["FOO"]'
printf %s\\n "In the shell, FOO is ${FOO} (after running python)"

上面的脚本打印以下输出:

代码语言:javascript
复制
In the shell FOO is value1 (before running python)
In python, FOO is value2
In the shell, FOO is value1 (after running python)

Git在做什么

在您提供的Git shell代码片段中,git stash临时更改了一些git调用的GIT_INDEX_FILE,以便stash可以执行一些索引变异操作,而不会扰乱您的索引:

  • 首先,git stash使用git read-tree创建临时索引文件,并将其内容初始化为HEAD.
  • Second,中的内容。git stash使用git add --interactive询问用户要隐藏哪些部分,并将所选更改保存在临时索引文件中。
  • 第三,git stash使用git write-tree将临时索引的内容作为树对象保存在Git repository.
  • Fourth,中git stash将树对象与HEAD进行比较,以确保您确实选择了要Git的内容git stash删除它创建的临时索引文件。
票数 1
EN

Stack Overflow用户

发布于 2012-12-31 13:45:18

你的问题的答案是“这是否意味着……”是的是的。

有多种方法可以查看一行环境变量表达式的结果;您可以观察到...

代码语言:javascript
复制
$ B=100 env | grep B
B=100

...or...

代码语言:javascript
复制
$ z=abc sh -c 'echo $z'
abc
票数 1
EN

Stack Overflow用户

发布于 2012-12-31 13:51:56

在BASH中,定义一个变量并在之后运行一个新流程存在一些问题。

如果您只是定义变量,则新进程不会继承该变量

让我们定义一个变量

代码语言:javascript
复制
$ VAR='value'
$ echo $VAR
value

然后进入一个新的过程

代码语言:javascript
复制
$ bash

var未定义

代码语言:javascript
复制
$ echo $VAR

$

但是一旦我们回来了

代码语言:javascript
复制
$ exit

将重新定义var

代码语言:javascript
复制
$ echo $VAR
value
$ 

通常的解决方法是使用export

代码语言:javascript
复制
$ export VAR2='yep'
$ bash
$ echo $VAR2
yep
$ 

您看到的(似乎是)另一种语法,它在子进程中赋值变量,而不是在原始进程中赋值

代码语言:javascript
复制
$ var3='wow' bash  #this line opens a new bash, and assigns the variable for this new bash
$ echo $var3
wow
$ exit
$ echo $var3

$ 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14097834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档