1、Tree对象介绍

接下来要探讨的 Git 对象类型是树对象(tree object),它能解决文件名保存的问题。tree对象可以存储文件名,也允许我们将多个文件组织到一起。

Git以一种类似于UNIX文件系统的方式存储内容,但做了一些简化。所有内容均以树(tree)对象和数据(blob )对象的形式存储,其中树对象对应了UNIX中的目录项,数据对象blob则大致上对应了文件中的内容。

一个树对象可以包含一条或多条记录(tree对象和blob 对象),每条记录含有一个指向blob 对象或者子tree对象的SHA-1指针,以及相应的模式、类型、文件名信息。

如下图:

# 文件模式、对象类型、对象的SHA-1指针、文件名
100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt

Tree对象存储方式如下图所示

2、Tree对象说明

(1)初始化一个新的本地版本库

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning
$ git init
Initialized empty Git repository in J:/git-repository/git_learning/.git/ L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ ll -a
total 8
drwxr-xr-x 1 L 197121 0 4月 11 14:50 ./
drwxr-xr-x 1 L 197121 0 4月 10 20:23 ../
drwxr-xr-x 1 L 197121 0 4月 11 14:50 .git/

(2)创建一个树对象(重点)

1)新建一个文件,然后把文件提交到本地版本库。

例如:新建文件test.txt,文件内容version 1

# 创建文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ echo "version 1" >> test.txt L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ ll
total 1
-rw-r--r-- 1 L 197121 10 4月 11 14:57 test.txt # 查看文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ cat test.txt
version 1

2)把test.txt文件,提交到本地版本库。

# 1.test.txt文件提交到本地版本库
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git hash-object -w ./test.txt
83baae61804e65cc73a7201a7252750c76066a30 # 2.查看Git数据库内容,可以看到新增了一个blob对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30 L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -t 83baae61804e65cc73a7201a7252750c76066a30
blob # 3.查看blob对象对象内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30
version 1

以上就和我们讲blob对象的操作一样。

此时test.txt文件被管理在Git本地版本库中。

3)创建一个树对象。

通常Git是根据暂存区或者索引文件index来创建tree对象,因此要把文件存储到暂存区进并建立index文件。

提示1:

index文件在.git目录中,最新初始化的Git本地仓库是没有index文件,只有添加过一次数据到暂存区之后,才会在.git目录中自动生成index文件。

新初始化的.git目录内容如下:是没有index文件的。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ ll .git/
total 7
-rw-r--r-- 1 L 197121 130 4月 11 14:50 config
-rw-r--r-- 1 L 197121 73 4月 11 14:50 description
-rw-r--r-- 1 L 197121 23 4月 11 14:50 HEAD
drwxr-xr-x 1 L 197121 0 4月 11 14:50 hooks/
drwxr-xr-x 1 L 197121 0 4月 11 14:50 info/
drwxr-xr-x 1 L 197121 0 4月 11 14:59 objects/
drwxr-xr-x 1 L 197121 0 4月 11 14:50 refs/

提示2:

可以通过git ls-files命令查看暂存区的文件信息。

参数信息如下,括号中简写:

  • --cached(-c): 查看暂存区中文件。git ls-files命令默认执行此选项。
  • --midified(-m):查看修改的文件。
  • --delete(-d):查看删除过的文件。
  • --other(-o) :查看没有被Git跟踪的文件。
  • --stage(-s):显示mode以及文件对应的Blob对象,进而我们可以获取暂存区中对应文件里面的内容。

例如:git ls-files -c或者git ls-files --cached (其他命令同理)

我们常用git ls-files -s命令查看暂存区的文件信息。

接下来,我们可以通过底层命令:update-indexwrite-treeread-tree等命令,轻松创建自己的tree对象。

# 1.查看暂存区当前状态,可以看到没有任何显示
# 说明暂存区没有存储任何文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s # 2.把test.txt文件存入暂存区
# 通过git update-index命令实现
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git update-index --add --cacheinfo 100644 \
> 83baae61804e65cc73a7201a7252750c76066a30 test.txt # 3.再次查看暂存区当前状态,可以看到暂存区中有一个文件了。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 83baae61804e65cc73a7201a7252750c76066a30 0 test.txt
# 这里就说明了为什么之前要把test.txt文件先存入到本地版本库中了,
# 因为需要文件的hash键,来添加到暂存区。
### 这里也说明了文件名和文件hash键的结合。(重点)

命令说明:

  • 为创建一个树对象,首先需要通过暂存一些文件到暂存区。

    通过底层命令 git update-index将一个单独文件存入暂存区中。
  • --add 选项:因为此前该文件并不在暂存区中,一个文件首次添加到暂存区,需要使用--add 选项。
  • --cacheinfo 选项:因为要添加的test.txt文件位于Git 数据库中(上一步的操作),而不是位于当前工作目录,所以需要--cacheinfo 选项。
  • 最后需要指定文件模式SHA-1文件名

文件模式说明:

  • 100644:表明这是一个普通文件。(blob对象的文件模式一般都为100644)
  • 100755:表示一个可执行文件。
  • 120000:表示一个符号链接。

继续,下面来观察生成的树对象::

# 4.完成上面步骤后,查看.git目录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ ll .git/
total 8
-rw-r--r-- 1 L 197121 130 4月 11 14:50 config
-rw-r--r-- 1 L 197121 73 4月 11 14:50 description
-rw-r--r-- 1 L 197121 23 4月 11 14:50 HEAD
drwxr-xr-x 1 L 197121 0 4月 11 14:50 hooks/
-rw-r--r-- 1 L 197121 104 4月 11 15:39 index # 出现了index文件
drwxr-xr-x 1 L 197121 0 4月 11 14:50 info/
drwxr-xr-x 1 L 197121 0 4月 11 14:59 objects/
drwxr-xr-x 1 L 197121 0 4月 11 14:50 refs/
# 这里提示一下,暂存区Stage可以理解成是一个简单的索引文件。
# 指的就是.git/index文件。(重点) # 5.现在先查看一下Git数据库内容,还是之前那一个blob对象。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30 # 6.把暂存区中的内容提交到本地版本库
# 换句话说就是把暂存区中存放的文件索引(快照)提交到本地版本库。
# 使用write-tree命令实现
# 也就是通过write-tree命令生成树对像
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git write-tree
d8329fc1cc938780ffdd9f94e0d364e0ea74f579 # 7.再次查看Git数据库内容,多了一个d8对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # 8.查看d8对象的类型,可以看到是一个树对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -t d8329fc1cc938780ffdd9f94e0d364e0ea74f579
tree # 9.再次查看暂存区当前状态,发现暂存区的内容没有清空
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 83baae61804e65cc73a7201a7252750c76066a30 0 test.txt
# 说明:在查看暂存区,发现暂存区的内容没有清空,即:暂存区内容写到版本库,暂存区不清空。(重点)

4)总结

以上就是在Git中,使用底层命令手动创建一个树对象的过程。

  • 创建一个文件,把该文件通过git hash-object命令存储到本地版本库中。
  • 通过git update-index命令,把文件存储到暂存区中。
  • 通过git write-tree命令,把暂存区中的文件索引信息提交到本地版本库,生成了一个树对象。

(3)创建第二个文件(重点)

1)新增new.txt文件,并修改test.txt文件内容。

# 1.创建new.txt文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ echo "new file" > new.txt # 2.修改test.txt文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ echo "version 2" >> test.txt # 3.查看两个文件的内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ cat new.txt
new file L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ cat test.txt
version 1
version 2 # 4.查看工作目录中的文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ ll
total 2
-rw-r--r-- 1 L 197121 9 4月 11 16:25 new.txt
-rw-r--r-- 1 L 197121 20 4月 11 16:25 test.txt

2)将new.txt文件和test.txt文件的第二个版本添加到暂存区。

test.txt文件添加到暂存区。

# 1.查看暂存区当前文件信息
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 83baae61804e65cc73a7201a7252750c76066a30 0 test.txt # 2.把test.txt文件提交到本地版本库
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git hash-object -w ./test.txt
0c1e7391ca4e59584f8b773ecdbbb9467eba1547 # 3.查看Git数据库内容,可以看到又多出一个0c对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/0c/1e7391ca4e59584f8b773ecdbbb9467eba1547
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579
# 提示:因上面修改了test.txt文件内容,在提交到版本库,内容不一样了hash就变了。 # 4.把修改后的test.txt文件加入暂存区
# 因为之前提交过test.txt文件到暂存区,所以不用加--add选项
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git update-index --cacheinfo 100644 \
> 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 test.txt # 5.查看暂存区当前文件信息
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 0 test.txt
# 我们可以看到,暂存区的test.txt文件被最新修改的版本覆盖了,
# 之前是83开头的
# 提示:暂存区是按对应文件覆盖的,新修改的文件,覆盖之前的原文件,
# 不会覆盖其他文件,即暂存区不是整体覆盖的。(重点)

new.txt文件添加到暂存区。

# 1.new.txt文件添加到暂存区
# 这次我们直接用一个命令把new.txt文件从工作区直接添加到暂存区
# 说明:
# 因为是new.txt文件是第一次添加到暂存区,所以需要--add选项
# 因为是从new.txt文件是在工作区,所以不需要--cacheinfo选项
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git update-index --add new.txt # 2.查看Git数据库内容,可以看到对了一个fa对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/0c/1e7391ca4e59584f8b773ecdbbb9467eba1547
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 # 3.查看暂存区当前文件信息,new.txt文件已经添加到暂存区中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 fa49b077972391ad58037050f2a75f74e3671e92 0 new.txt
100644 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 0 test.txt

说明:git update-index --add 文件名完成了之前的两步操作。

  1. new.txt文件内容存入了Git版本库。
  2. new.txt文件添加到了暂存区中。

3)把暂存区的内容提交的本地版本库。

此时工作目录和暂存区中的文件状态是一样的, 可以通过git write-tree命令提交到本地版本库,生成树对像了。

# 1.提交暂存区内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git write-tree
163b45f0a0925b0655da232ea8a4188ccec615f5 # 2.查看Git数据库内容,可以看到又多了一个名为16的tree对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/0c/1e7391ca4e59584f8b773ecdbbb9467eba1547
.git/objects/16/3b45f0a0925b0655da232ea8a4188ccec615f5
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -t 163b45f0a0925b0655da232ea8a4188ccec615f5
tree

此时Git版本库中的5个对象,即表示了项目的2个版本。(不明白这句话?继续往下看)

(4)将第一个树对象加入暂存区,使其成为新的树对

# 1.查看暂存区当前文件信息
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 fa49b077972391ad58037050f2a75f74e3671e92 0 new.txt
100644 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 0 test.txt # 2.将第一个树对象加入暂存区
# 第一个树对象hash:d8329fc1cc938780ffdd9f94e0d364e0ea74f579
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579 # 3.再次查看暂存区当前文件信息,有多了一个bak/test.txt文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git ls-files -s
100644 83baae61804e65cc73a7201a7252750c76066a30 0 bak/test.txt
100644 fa49b077972391ad58037050f2a75f74e3671e92 0 new.txt
100644 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 0 test.txt

说明:

  • read-tree命令:可以把树对象读入暂存区。
  • --prefix=bak选项:将一个已有的树对象作为子树读入暂存区。

接下来继续,再提交暂存区的内容,会继续生成一个新的tree对象在Git仓库中。

# 把暂存区的内容生成新的tree对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git write-tree
01ab2a43b1eb150bcf00f375800727df240cf653 # 查看新生成的对象
# 查看tree对象的类型
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -t 01ab2a43b1eb150bcf00f375800727df240cf653
tree # 查看tree对象的内容,也就是记录暂存区的内容。
# 可以看到该tree对象,包含了两个blob对象和一个tree对象。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ git cat-file -p 01ab2a43b1eb150bcf00f375800727df240cf653
040000 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 bak
100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt
100644 blob 0c1e7391ca4e59584f8b773ecdbbb9467eba1547 test.txt # 查看当前Git仓库中的对象
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/git_learning (master)
$ find .git/objects -type f
.git/objects/01/ab2a43b1eb150bcf00f375800727df240cf653
.git/objects/0c/1e7391ca4e59584f8b773ecdbbb9467eba1547
.git/objects/16/3b45f0a0925b0655da232ea8a4188ccec615f5
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92

到这里我们的演示就完成了,请看下面的总结。

3、总结

(1)分析每个树对象的存储结构

我们可以先查看一下Git本地库中的对象,如下

.git/objects/01/ab2a43b1eb150bcf00f375800727df240cf653 # 第三个tree树对象
.git/objects/0c/1e7391ca4e59584f8b773ecdbbb9467eba1547 # test.txt第二个版本(blob对象)
.git/objects/16/3b45f0a0925b0655da232ea8a4188ccec615f5 # 第二个tree树对象
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30 # test.txt第一个版本(blob对象)
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # 第一个tree树对象
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 # new.txt第一个版本(blob对象)

我们接下来用三个图,描述一下三个树对象的结构关系。

第一个树对象结构如下图

第二个树对象结构如下图

第三个树对象结构如下图

也可以换Git对象类型表示:

(2)blob对象和tree对象(重点)

从上图我们可以分析出:

  • blob对象代表文件一次次的版本。
  • tree对象代表项目的一次次的版本。

这就是我前面2-(3)描述过的Git版本库中的5个对象,即表示了项目的2个版本。

(就先这样理解)

(3)总结(重点)

暂存区的概念和相关理解:

  1. 所谓的暂存区Stage只是一个简单的索引文件而已。指的是是 .git/index文件。
  2. 暂存区这个索引文件里面包含的是文件的目录树,像一个虚拟的工作区,在这个虚拟工作区的目录树中,记录了文件名、文件的时间戳、文件长度、文件类型以及最重要的SHA-1值,文件的内容并没有存储在其中,所以说它像一个虚拟的工作区。

    即:暂存区,也就是.git/index文件中存放的是文件内容的索引(快照),也可以是tree对象的索引。
  3. 索引指向的是.git/objects/目录下的文件(Git对象)。
  4. Git通过暂存区的文件索引信息来创建tree对象的。
  5. tree对象可以使文件内容和文件名进行关联。
  6. 一个树对象可以包含一条或多条记录(tree对象和blob 对象)。
  7. 暂存区内容写到版本库中后,暂存区索引内容不清空。
  8. 暂存区中的文件内容索引,是按对应文件覆盖的,也就是修改一个文件内容,添加到缓存区,只会把对应的文件覆盖,其他文件不会被覆盖,即:暂存区不是整体覆盖的。

暂存区的作用:除非是绕过暂存区直接提交,否则Git想把修改提交上去,就必须将修改存入暂存区最后才能commit。每次提交的是暂存区所对应的文件快照。

提示:Git对象的hash键,我们截取前几位就行,练习时对象不那么对,就不用全部都写,能够表示唯一对象就行。

4、问题

现在有三个树对象(因为执行了三次write-tree命令),分别代表了我们想要跟踪项目的三次快照。然而问题依旧:若想重用这些快照,你必须记住这三个树对象的SHA-1哈希值。

并且,你也完全不知道是谁保存了这些快照,在什么时刻保存的,以及为什么保存这些快照。

而以上这些,提交对象commit object为你保存了这些基本信息。

5、本文用到的命令总结

Git底层命令:

  • git update-index --add:把文件索引(快照)存入暂存区中。
  • git write-tree:将当前暂存区的索引内容同步到一个树对象中。
  • git ls-files -s:查看暂存区的文件信息。
  • git read-tree --prefix=bak:将一个已存在的树对象添加到暂存区。
  • git cat-file -t 键:查看Git对象的类型。
  • git cat-file -p 键:查看Git对象的内容。

参考:

『现学现忘』Git对象 — 16、Tree对象详解的更多相关文章

  1. 『现学现忘』Git对象 — 17、Commit对象

    目录 1.Commit对象介绍 2.Commit对象说明 3.本地库中对象之间的关系 4.总结 5.练习 6.本文用到的命令总结 1.Commit对象介绍 现在来介绍最后一种Git对象commit对象 ...

  2. 『现学现忘』Git基础 — 18、Git对象的总结

    目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...

  3. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

  4. Ubuntu下Git从搭建到使用详解

    Ubuntu下Git从搭建到使用详解 一.git的搭建 (1).sudo apt-get update (2).sudo apt-get -y install git 符:安装最新版本方法: add- ...

  5. git概念及工作流程详解

    git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...

  6. 007-Scala类的属性和对象私有字段实战详解

    007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 gett ...

  7. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  8. Git学习系列之Windows上安装Git详细步骤(图文详解)

    前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...

  9. Dream------scala--类的属性和对象私有字段实战详解

    Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...

随机推荐

  1. Pipeline 有什么好处,为什么要用 pipeline?

    答:可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有 因果相关性.使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS 峰值的一 ...

  2. IDEA 常用快捷键操作

    自定义设置及查询: 操作路径:file-setting-Keymap-Editor actions 右击需要修改的action操作,或者右击Editor actions,选择添加Add Keyboar ...

  3. thrift源码分析

    1 前言 学习thrift源码主要为了弄清楚几个问题 thrift客户端和服务端的通信流程是如何的 thrift的IDL中给属性加上编号的作用是什么 thrift中require.optional和默 ...

  4. Spring 对 DAO 的支持?

    Spring 对数据访问对象(DAO)的支持旨在简化它和数据访问技术如 JDBC, Hibernate or JDO 结合使用.这使我们可以方便切换持久层.编码时也不用担心 会捕获每种技术特有的异常.

  5. AOP——基于AspectJ的注解来实现AOP操作

    1.使用注解方式实现AOP操作 第一步:创建对象 <!-- 创建对象 --> <bean id="book" class="com.bjxb.aop.B ...

  6. 【Linux-vim】vim文件:查看某几行,把某几行复制到另一个文件中

    一.查看文件的某几行1.使用cat命令(1)查看文件的前10行: cat filename |head -n 10(2)查看文件后10行: cat filename |tail -n 10(3)查看文 ...

  7. Numpy对数组按索引查询

    Numpy对数组按索引查询 三种索引方法: 基础索引 神奇索引 布尔索引 基础索引 一维数组 和Python的List一样 二维数组 注意:切片的修改会修改原来的数组 原因:Numpy经常要处理大数组 ...

  8. 罗振宇2022"时间的朋友"跨年演讲

    罗振宇2022"时间的朋友"跨年演讲 行就行,不行我再想想办法. 原来,还能这么干! 堆资源不是解决问题的唯一道路,还是那句话:"处于困境中的人往往只关注自己的问题.而解 ...

  9. (Math.round(num*100)/100).toFixed(2); 将输入的数字变成保留两位小数

    <input type="number" @input="onInputPrice" @blur="onPrice" data-id= ...

  10. js 中的submit 回调函数

    1.submit.php <?php $arr = $_POST; $arr['msg']=1; //echo $_POST['uname']; echo json_encode($arr); ...