分类 技术 下的文章

问题:

代码如下:

int i = 23;
float f = 3.14;
if (i == f) // 执行某段代码

编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢?

回答:

在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u < -1就是对的了)。

和C语言中的大部分机制(在C++中得到继承)一样,就硬件操作而言,常见的算术转换应该简明易懂。C语言的发明者精通他们所使用机器上的汇编语言,他们编写的C语言对他们和像他们一样编写程序的人有直接的意义,直到使用汇编语言编写(诸如UNIX内核)的程序时。

现如今,一般来说,处理器并不具有混合类型的指令系统(如float和double相加、比较int和float,诸如此类),因为如果这样做造成芯片晶圆的巨大浪费——如果你想支持更多不同的类型,你不得不实现更多的操作码。然而,在实际中,你只有实现"add int to int"、"compare float to float"和"multiply unsigned with unsigned"等功能的常见指令,这使得优先进行算术转换变得很有必要——它们是指令系统中两种类型的映射关系,它们中的大部分很有用处。

从习惯编写低级别机器代码的编程人员的角度来说,如果有了混合类型,那么在一般情况下最有可能使用的汇编指令就是那些只需要进行最少类型转换的指令。其中,有一种特殊情况就是浮点数的转换,特别是在20世纪70年代早期,当时C语言正在被开发,计算机运行速度很慢,而浮点数的计算是通过软件完成的,所以进行转换的成本很高。这拖慢了常用算术运算的转换开发——当时只有一种操作数实现了转换(这个例外就是long到unsigned int的转换,这种转换没有任何要求,在大部分机器上都可以进行。当然并不是全部,因为总有例外情况)。

所以,编写常用的算术转换是为了完成汇编程序员在大部分时间需要做的事情:即有两种不匹配的类型,将一种转换成另一种。这也就是汇编代码所做的事情,除非有特别原因需要进行其它类型转换。对于那些习惯编写汇编代码的人来说,除非是特殊需要,才会被迫去编写一种不同的类型转换。显然,这种情况下提出编写转换是很自然的事情。虽然,你可以简单地写成这样

if((double) i < (double) f)

顺便提一下,在这个问题中有趣的是,unsigned的优先级高于int,所以把intunsigned进行比较时,最终进行的是unsigned类型的比较(开头提到的0u < -1就是这个道理)。我猜测这可能是在早些时候(计算机发展初期),当时的人们认为unsignedint在所表示的数值范围上受到的限制更小:现在还不需要符号位,所以可以使用额外的位来表示更大的数值范围。如果你觉得int可能会溢出,那么就使用unsigned好了——在使用16位表示的ints时这个担心会更明显。


via: stackoverflow

作者:wintermute 译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

欢迎大家,今天我们学习一下 docker 基本映像以及如何构建我们自己的 docker 基本映像。Docker 是一个开源项目,提供了一个可以打包、装载和运行任何应用的轻量级容器的开放平台。它没有语言支持、框架和打包系统的限制,从小型的家用电脑到高端服务器,在何时何地都可以运行。这使它们可以不依赖于特定软件栈和供应商,像一块块积木一样部署和扩展网络应用、数据库和后端服务。

Docker 映像是不可更改的只读层。Docker 使用 Union File System 在只读文件系统上增加可读写的文件系统,但所有更改都发生在最顶层的可写层,而其下的只读映像上的原始文件仍然不会改变。由于映像不会改变,也就没有状态。基本映像是没有父类的那些映像。Docker 基本映像主要的好处是它允许我们有一个独立运行的 Linux 操作系统。

下面是我们如何可以创建自定义的基本映像的方式。

1. 使用 Tar 创建 Docker 基本映像

我们可以使用 tar 构建我们自己的基本映像,我们从一个运行中的 Linux 发行版开始,将其打包为基本映像。这过程可能会有些不同,它取决于我们打算构建的发行版。在 Debian 发行版中,已经预带了 debootstrap。在开始下面的步骤之前,我们需要安装 debootstrap。debootstrap 用来获取构建基本系统需要的包。这里,我们构建基于 Ubuntu 14.04 "Trusty" 的映像。要完成这些,我们需要在终端或者 shell 中运行以下命令。

$ sudo debootstrap trusty trusty > /dev/null
$ sudo tar -C trusty -c . | sudo docker import - trusty

使用debootstrap构建docker基本映像

上面的命令为当前文件夹创建了一个 tar 文件并输出到标准输出中,"docker import - trusty" 通过管道从标准输入中获取这个 tar 文件并根据它创建一个名为 trusty 的基本映像。然后,如下所示,我们将运行映像内部的一条测试命令。

$  docker run trusty cat /etc/lsb-release

Docker GitHub Repo 中有一些允许我们快速构建基本映像的事例脚本.

2. 使用Scratch构建基本映像

在 Docker registry 中,有一个被称为 Scratch 的使用空 tar 文件构建的特殊库:

$ tar cv --files-from /dev/null | docker import - scratch

使用scratch构建docker基本映像

我们可以使用这个映像构建新的小容器:

FROM scratch
ADD script.sh /usr/local/bin/run.sh
CMD ["/usr/local/bin/run.sh"]

上面的 Dockerfile 文件来自一个很小的映像。这里,它首先从一个完全空的文件系统开始,然后它复制新建的 /usr/local/bin/run.sh 为 script.sh ,然后运行脚本 /usr/local/bin/run.sh。

结尾

这这个教程中,我们学习了如何构建一个开箱即用的自定义 Docker 基本映像。构建一个 docker 基本映像是一个很简单的任务,因为这里有很多已经可用的包和脚本。如果我们想要在里面安装想要的东西,构建 docker 基本映像非常有用。如果有任何疑问,建议或者反馈,请在下面的评论框中写下来。非常感谢!享受吧 :-)


via: http://linoxide.com/linux-how-to/2-ways-create-docker-base-image/

作者:Arun Pyasi 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Vault是用来安全的获取秘密信息的工具,它可以保存密码、API密钥、证书等信息。Vault提供了一个统一的接口来访问秘密信息,其具有健壮的访问控制机制和丰富的事件日志。

对关键信息的授权访问是一个困难的问题,尤其是当有许多用户角色,并且用户请求不同的关键信息时,例如用不同权限登录数据库的登录配置,用于外部服务的API密钥,SOA通信的证书等。当保密信息由不同的平台进行管理,并使用一些自定义的配置时,情况变得更糟,因此,安全的存储、管理审计日志几乎是不可能的。但Vault为这种复杂情况提供了一个解决方案。

突出特点

数据加密:Vault能够在不存储数据的情况下对数据进行加密、解密。开发者们便可以存储加密后的数据而无需开发自己的加密技术,Vault还允许安全团队自定义安全参数。

安全密码存储:Vault在将秘密信息(API密钥、密码、证书)存储到持久化存储之前对数据进行加密。因此,如果有人偶尔拿到了存储的数据,这也没有任何意义,除非加密后的信息能被解密。

动态密码:Vault可以随时为AWS、SQL数据库等类似的系统产生密码。比如,如果应用需要访问AWS S3 桶,它向Vault请求AWS密钥对,Vault将给出带有租期的所需秘密信息。一旦租用期过期,这个秘密信息就不再存储。

租赁和更新:Vault给出的秘密信息带有租期,一旦租用期过期,它便立刻收回秘密信息,如果应用仍需要该秘密信息,则可以通过API更新租用期。

撤销:在租用期到期之前,Vault可以撤销一个秘密信息或者一个秘密信息树。

安装Vault

有两种方式来安装使用Vault。

1. 预编译的Vault二进制 能用于所有的Linux发行版,下载地址如下,下载之后,解压并将它放在系统PATH路径下,以方便调用。

wget binary

下载相应的预编译的Vault二进制版本。

vault

解压下载到本地的二进制版本。

祝贺你!您现在可以使用Vault了。

2. 从源代码编译是另一种在系统中安装Vault的方式。在安装Vault之前需要安装GO和GIT。

Redhat系统中安装GO 使用下面的指令:

sudo yum install go

Debin系统中安装GO 使用下面的指令:

sudo apt-get install golang

或者

sudo add-apt-repository ppa:gophers/go

sudo apt-get update

sudo apt-get install golang-stable

Redhat系统中安装GIT 使用下面的命令:

sudo yum install git

Debian系统中安装GIT 使用下面的命令:

sudo apt-get install git

一旦GO和GIT都已被安装好,我们便可以开始从源码编译安装Vault。

将下列的Vault仓库拷贝至GOPATH
https://github.com/hashicorp/vault
测试下面的文件是否存在,如果它不存在,那么Vault没有被克隆到合适的路径。
$GOPATH/src/github.com/hashicorp/vault/main.go
执行下面的指令来编译Vault,并将二进制文件放到系统bin目录下。
make dev

path

一份Vault入门教程

我们已经编制了一份Vault的官方交互式教程,并带有它在SSH上的输出信息。

概述

这份教程包括下列步骤:

  • 初始化并启封您的Vault
  • 在Vault中对您的请求授权
  • 读写秘密信息
  • 密封您的Vault

初始化您的Vault

首先,我们需要为您初始化一个Vault的工作实例。在初始化过程中,您可以配置Vault的密封行为。简单起见,现在使用一个启封密钥来初始化Vault,命令如下:

vault init -key-shares=1 -key-threshold=1

您会注意到Vault在这里输出了几个密钥。不要清除您的终端,这些密钥在后面的步骤中会使用到。

Initializing SSH

启封您的Vault

当一个Vault服务器启动时,它是密封的状态。在这种状态下,Vault被配置为知道物理存储在哪里及如何存取它,但不知道如何对其进行解密。Vault使用加密密钥来加密数据。这个密钥由"主密钥"加密,主密钥不保存。解密主密钥需要入口密钥。在这个例子中,我们使用了一个入口密钥来解密这个主密钥。

vault unseal <key 1>

Unsealing SSH

为您的请求授权

在执行任何操作之前,连接的客户端必须是被授权的。授权的过程是检验一个人或者机器是否如其所申明的那样具有正确的身份。这个身份用在向Vault发送请求时。为简单起见,我们将使用在步骤2中生成的root令牌,这个信息可以回滚终端屏幕看到。使用一个客户端令牌进行授权:

vault auth <root token>

Authorize SSH

读写保密信息

现在Vault已经被设置妥当,我们可以开始读写默认挂载的秘密后端里面的秘密信息了。写在Vault中的秘密信息首先被加密,然后被写入后端存储中。后端存储机制绝不会看到未加密的信息,并且也没有在Vault之外解密的需要。

vault write secret/hello value=world

当然,您接下来便可以读这个保密信息了:

vault read secret/hello

RW_SSH

密封您的Vault

还有一个用I来密封Vault的API。它将丢掉现在的加密密钥并需要另一个启封过程来恢复它。密封仅需要一个拥有root权限的操作者。这是一种罕见的"打破玻璃过程"的典型部分。

这种方式中,如果检测到一个入侵,Vault数据将会立刻被锁住,以便最小化损失。如果不能访问到主密钥碎片的话,就不能再次获取数据。

vault seal

Seal Vault SSH

这便是入门教程的结尾。

总结

Vault是一个非常有用的应用,它提供了一个可靠且安全的存储关键信息的方式。另外,它在存储前加密关键信息、审计日志维护、以租期的方式获取秘密信息,且一旦租用期过期它将立刻收回秘密信息。Vault是平台无关的,并且可以免费下载和安装。要发掘Vault的更多信息,请访问其官方网站


via: http://linoxide.com/how-tos/secure-secret-store-vault/

作者:Aun Raza 译者:wwy-hust 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

微软令人意外地发布了Visual Studio Code,并支持主要的桌面平台,当然包括linux。如果你是一名需要在ubuntu工作的web开发人员,你可以非常轻松的安装Visual Studio Code

我将要使用Ubuntu Make来安装Visual Studio Code。Ubuntu Make,就是以前的Ubuntu开发者工具中心,是一个命令行工具,帮助用户快速安装各种开发工具、语言和IDE。也可以使用Ubuntu Make轻松安装Android Studio 和其他IDE,如Eclipse。本文将展示如何在Ubuntu中使用Ubuntu Make安装Visual Studio Code。(译注:也可以直接去微软官网下载安装包)

安装微软Visual Studio Code

开始之前,首先需要安装Ubuntu Make。虽然Ubuntu Make存在Ubuntu15.04官方库中,但是需要Ubuntu Make 0.7以上版本才能安装Visual Studio。所以,需要通过官方PPA更新到最新的Ubuntu Make。此PPA支持Ubuntu 14.04, 14.10 和 15.04。

注意,仅支持64位版本

打开终端,使用下列命令,通过官方PPA来安装Ubuntu Make:

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make

安装Ubuntu Make完后,接着使用下列命令安装Visual Studio Code:

umake web visual-studio-code

安装过程中,将会询问安装路径,如下图:

在抛出一堆要求和条件后,它会询问你是否确认安装Visual Studio Code。输入‘a’来确定:

确定之后,安装程序会开始下载并安装。安装完成后,你可以发现Visual Studio Code 图标已经出现在了Unity启动器上。点击图标开始运行!下图是Ubuntu 15.04 Unity的截图:

卸载Visual Studio Code

卸载Visual Studio Code,同样使用Ubuntu Make命令。如下:

umake web visual-studio-code --remove

如果你不打算使用Ubuntu Make,也可以通过微软官方下载安装文件。

怎样!是不是超级简单就可以安装Visual Studio Code,这都归功于Ubuntu Make。我希望这篇文章能帮助到你。如果您有任何问题或建议,欢迎给我留言。


via: http://itsfoss.com/install-visual-studio-code-ubuntu/

作者:Abhishek 译者:Vic020/VicYu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我已经使用git差不多18个月了,觉得自己对它应该已经非常了解。然后来自GitHub的Scott Chacon过来给LVS做培训(LVS是一个赌博软件供应商和开发商,从2013年开始的合同),而我在第一天里就学到了很多。

作为一个对git感觉良好的人,我觉得分享从社区里掌握的一些有价值的信息,也许能帮某人解决问题而不用做太深入研究。

基本技巧

1. 安装后的第一步

在安装好git后,你第一件该做的事是设置你的名字和电子邮箱,因为每次提交都要用到这些信息:

$ git config --global user.name "Some One"
$ git config --global user.email "[email protected]"

2. Git是基于指针的

保存在git里的一切都是文件。当你创建一个提交的时候,会建立一个包含你的提交信息和相关数据(名字,邮件地址,日期/时间,前一个提交,等等)的文件,并把它链接到一个树文件中。这个树文件中包含了对象或其他树的列表。这里的提到的对象(或二进制大对象)是和本次提交相关的实际内容(它也是一个文件,另外,尽管文件名并没有包含在对象里,但是存储在树中)。所有这些文件都使用对象的SHA-1哈希值作为文件名。

用这种方式,分支和标签就是简单的文件(基本上是这样),包含指向该提交的SHA-1哈希值。使用这些索引会带来优秀的灵活性和速度,比如创建一个新分支就是简单地用分支名字和所分出的那个提交的SHA-1索引来创建一个文件。当然,你不需要自己做这些,而只要使用Git命令行工具(或者GUI),但是实际上就是这么简单。

你也许听说过叫HEAD的索引。这只是简单的一个文件,包含了你当前指向的那个提交的SHA-1索引值。如果你正在解决一次合并冲突然后看到了HEAD,这并不是一个特别的分支或分支上的一个必需的特殊位置,只是标明你当前所在位置。

所有的分支指针都保存在.git/refs/heads里,HEAD在.git/HEAD里,而标签保存在.git/refs/tags里 - 自己可以随便进去看看。

3. 两个爸爸(父节点) - 你没看错!

在历史中查看一个合并提交的信息时,你将看到有两个父节点(不同于工作副本上的常规提交的情况)。第一个父节点是你所在的分支,第二个是你合并过来的分支。

4. 合并冲突

目前我相信你碰到过合并冲突并且解决过。通常是编辑一下文件,去掉<<<<,====,>>>>标志,保留需要留下的代码。有时能够看到这两个修改之前的代码会很不错,比如,在这两个现在冲突的分支之前的改动。下面是一种方式:

$ git diff --merge
diff --cc dummy.rb  
index 5175dde,0c65895..4a00477  
--- a/dummy.rb
+++ b/dummy.rb
@@@ -1,5 -1,5 +1,5 @@@
  class MyFoo
    def say
-     puts "Bonjour"
 -    puts "Hello world"
++    puts "Annyong Haseyo"
    end
  end

如果是二进制文件,比较差异就没那么简单了...通常你要做的就是测试这个二进制文件的两个版本来决定保留哪个(或者在二进制文件编辑器里手工复制冲突部分)。从一个特定分支获取文件拷贝(比如说你在合并master和feature123两个分支):

$ git checkout master flash/foo.fla # 或者...
$ git checkout feature132 flash/foo.fla
$ # 然后...
$ git add flash/foo.fla

另一种方式是通过git输出文件 - 你可以输出到另外的文件名,然后当你决定了要用哪个后,再将选定的正确文件复制为正常的文件名:

$ git show master:flash/foo.fla > master-foo.fla
$ git show feature132:flash/foo.fla > feature132-foo.fla
$ # 检出master-foo.fla和feature132-foo.fla
$ # 假如说我们决定来自feature132的文件是正确的
$ rm flash/foo.fla
$ mv feature132-foo.fla flash/foo.fla
$ rm master-foo.fla
$ git add flash/foo.fla

更新:感谢Carl在原博客文章上评论里的提醒,你实际上可以用“git checkout —ours flash/foo.fla”和“git checkout —theirs flash/foo.fla”来检出特定版本的文件,而不用记住你在合并的分支名字。就我个人来说喜欢更精确一点,但这也是一种方式...

记着在解决完冲突后要将文件加入提交(像我上面做的那样)。

服务器,分支和标签

5. 远端服务器

git的一个超强大的功能就是可以有不止一个远端服务器(实际上你一直都在一个本地仓库上工作)。你并不是一定都要有这些服务器的写权限,你可以有多个可以读取的服务器(用来合并他们的工作)然后写入到另外一个仓库。添加一个新的远端服务器很简单:

$ git remote add john [email protected]:johnsomeone/someproject.git

如果你想查看远端服务器的信息可以这样做:

# 显示每个远端服务器的URL
$ git remote -v 

# 提供更多详细信息
$ git remote show name 

你随时都可以查看本地分支和远端分支的差异:

$ git diff master..john/master

你也可以查看没有在远端分支上的HEAD的改动:

$ git log remote/branch..
# 注意:..后面没有结束的特定引用

6. 标签

在git里有两种类型的标签 - 轻量级标签和带注释标签。记住技巧2里说过git是基于指针的,这两者之间的差异也很简单。轻量级标签只是一个简单的指向一次提交的带名字指针。你随时都可以将它指向另一个提交。带注释标签是一个指向标签对象的带名字指针,带有自己的信息和历史。因为有自己的信息,它可以根据需要用GPG签名。

建立这两种类型的标签都很简单(只有一个命令行开关的差异)

$ git tag to-be-tested
$ git tag -a v1.1.0 # 会提示输入标签的信息

7. 建立分支

在git里建立分支非常简单(而且像闪电一样快,因为它只需要创建一个小于100字节的文件)。用普通方式建立新分支并切换过去:

$ git branch feature132
$ git checkout feature132

当然,如果你确定自己直接切换到新建的分支,可以用一个命令实现:

$ git checkout -b feature132

如果你想重命名一个本地分支也很简单(可以显示发生了什么的较长的方式):

$ git checkout -b twitter-experiment feature132
$ git branch -d feature132

更新:你也可以(像Brian Palmer在原博客文章的评论里提出的)只用“git branch”的-m开关在一个命令里实现(像Mike提出的,如果你只指定了一个分支参数,就会重命名当前分支):

$ git branch -m twitter-experiment
$ git branch -m feature132 twitter-experiment

8. 合并分支

也许在将来的某个时候,你希望将改动合并。有两种方式:

$ git checkout master
$ git merge feature83 # 或者...
$ git rebase feature83

merge和rebase之间的差别是merge会尝试处理改动并建立一个新的混合了两者的提交。rebase会尝试把你从一个分支最后一次分离后的所有改动,一个个加到该分支的HEAD上。不过,在已经将分支推到远端服务器后不要再rebase了 - 这会引起冲突/问题。

如果你不确定在哪些分支上还有独有的工作 - 所以你也不知道哪些分支需要合并而哪些可以删除,git branch有两个开关可以帮你:

# 显示已经全部合并到当前分支的分支
$ git branch --merged

# 显示没有合并到当前分支的分支
$ git branch --no-merged

9. 远端分支

如果你在本地有一个分支希望推到远端服务器上,你可以用一行命令推送上去:

$ git push origin twitter-experiment:refs/heads/twitter-experiment
# origin是我们服务器的名字,而twitter-experiment是分支名字

更新:感谢Erlend在原博客文章上的评论 - 这个实际上和git push origin twitter-experiment效果一样,不过使用完整的语法,你可以在两者之间使用不同的分支名(这样本地分支可以是add-ssl-support而远端是issue-1723)。

如果你想在远端服务器上删除一个分支(注意分支名前面的冒号):

$ git push origin :twitter-experiment

如果你想查看所有远端分支的状态可以这样做:

$ git remote show origin

这个命令可能会列出服务器上一些以前有过但现在已经不在了的分支。如果碰到这种情况你可以用下面的命令从你本地分支里清理掉:

$ git remote prune

最后,如果你想在本地跟踪一个远端分支,普通的方式是:

$ git branch --track myfeature origin/myfeature
$ git checkout myfeature

不过,新版的git在使用-b标记检出分支时会自动设定跟踪:

$ git checkout -b myfeature origin/myfeature

在储藏点,索引和文件系统中保存内容

10. 储藏

在git里你可以把当前工作状态放进一个储藏堆栈中,然后可以再取出来。最简单的情形是下面这样:

$ git stash
# 做点其他事情...
$ git stash pop

许多人建议使用git stash apply来代替pop,不过如果这样做的话最后会遗留一个很长的储藏列表。而“pop”会在全部加载后自动从堆栈中移除。如果使用过git stash apply,你也可以使用下面的命令从堆栈上移除最后一项:

$ git stash drop

git会基于当前的提交信息自动创建评论。如果你更希望有自定义信息的话(因为它可能和前一个提交没有任何联系):

$ git stash save "My stash message"

如果你希望从列表中取出一个特定的储藏点(不一定非得是最后一个)可以先列出它们然后用下面的方式取出:

$ git stash list
  stash@{0}: On master: Changed to German
  stash@{1}: On master: Language is now Italian
$ git stash apply stash@{1}

11. 交互式添加

在subversion的世界里你只能修改文件然后提交所有改动。而在git里你有强大得多的方式来提交部分文件或者甚至是部分补丁。提交部分文件或文件中的部分改动你需要进入交互式模式:

$ git add -i
           staged     unstaged path


*** Commands ***
  1: status      2: update   3: revert   4: add untracked
  5: patch      6: diff     7: quit     8: help
What now>  

这会让你进入一个基于菜单的交互式提示。你可以使用命令中的数字或高亮的字母(如果你在终端里打开了高亮的话)来进入相应的模式。然后就只是输入你希望操作的文件的数字了(你可以使用这样的格式,1或者1-4或2,4,7)。

如果你想进入补丁模式(交互式模式下按‘p’或‘5’),你也可以直接进入:

$ git add -p    
diff --git a/dummy.rb b/dummy.rb  
index 4a00477..f856fb0 100644  
--- a/dummy.rb
+++ b/dummy.rb
@@ -1,5 +1,5 @@
 class MyFoo
   def say
-    puts "Annyong Haseyo"
+    puts "Guten Tag"
   end
 end
Stage this hunk [y,n,q,a,d,/,e,?]?  

你可以看到下方会有一些选项供选择用来添加该文件的这个改动、该文件的所有改动,等等。使用‘?’命令可以详细解释这些选项。

12. 从文件系统里保存/取回改动

有些项目(比如Git项目本身)在git文件系统中直接保存额外文件而并没有将它们加入到版本控制中。

让我们从在git中存储一个随机文件开始:

$ echo "Foo" | git hash-object -w --stdin
51fc03a9bb365fae74fd2bf66517b30bf48020cb  

这样这个目标文件就已经保存到数据库中了,但是如果你没有设定一个指向它的指针的话它会被当做垃圾回收。最简单的方式是设定一个标签:

$ git tag myfile 51fc03a9bb365fae74fd2bf66517b30bf48020cb

注意这里我们使用了标签myfile。当我们需要使用这个文件的时候可以这样做:

$ git cat-file blob myfile

这个对于一些工具文件很有用,开发者可能会用到(密码,GPG密钥,等等)但是又不希望每次都检出到硬盘(尤其是在实际工作中)。

日志以及有哪些改动?

13. 查看日志

长时间使用 Git 的话,不会没用过‘git log’来查看最近的提交。不过,有一些技巧来更好地应用。比如,你可以使用下面的命令来查看每次提交的具体改动:

$ git log -p

或者你可以仅仅查看有哪些文件改动:

$ git log --stat

有个很不错的别名你可以试试,会显示简短提交名和一个不错的分支图并在一行里显示提交信息(有点像gitk,但是是在命令行下):

$ git config --global alias.lol "log --pretty=oneline --abbrev-commit --graph --decorate"
$ git lol
* 4d2409a (master) Oops, meant that to be in Korean
* 169b845 Hello world

14. 搜索日志

如果你想找特定提交者可以这样做:

$ git log --author=Andy

更新:感谢Johannes的评论,我已经去掉了之前这里的一些有混淆的地方。

或者你想在提交信息里找一些相关字段:

$ git log --grep="Something in the message"

也有一个更强大的叫做pickaxe的命令用来查找包含了删除或添加的某个特定内容的提交(比如,该内容第一次出现或被删除)。这可以告诉你什么时候增加了一行(但这一行里的某个字符后面被改动过就不行了):

$ git log -S "TODO: Check for admin status"

假如你改动了一个特定的文件,比如lib/foo.rb

$ git log lib/foo.rb

比如说你有一个feature/132分支和feature/145分支,然后你想看看这两个分支上不在master分支里的提交(注意 符号是不在的意思):

$ git log feature/132 feature/145 ^master

你也可以使用ActiveSupport格式的日期来缩小到某个日期范围:

$ git log --since=2.months.ago --until=1.day.ago

默认情况下会用OR来组合查询,但你可以轻易地改为AND(如果你有超过一条的查询标准)

$ git log --since=2.months.ago --until=1.day.ago --author=andy -S "something" --all-match

15. 查看/修改版本

有很多方式可以用来引用一个版本,看你记得哪个:

$ git show 12a86bc38 # 根据版本
$ git show v1.0.1 # 根据标签
$ git show feature132 # 根据分支名
$ git show 12a86bc38^ # 一次提交的父节点
$ git show 12a86bc38~2 # 一次提交的祖父节点
$ git show feature132@{yesterday} # 时间相关
$ git show feature132@{2.hours.ago} # 时间相关

注意和之前部分有些不同,末尾的 的意思是该提交的父节点 - 开始位置的 的意思是不在这个分支。

16. 选择范围

最简单的方式:

$ git log origin/master..new
# [old]..[new] - 所有你还没有推送的提交

你也可以省略[new],将使用当前的HEAD。

时光回溯和后悔药

17. 重置改动

如果你还没有提交的话可以用下面的命令轻松地取消改动:

$ git reset HEAD lib/foo.rb

通常会使用‘unstage’的别名,因为上面的看上去有些不直观。

$ git config --global alias.unstage "reset HEAD"
$ git unstage lib/foo.rb

如果你已经提交了该文件,你可以做两件事 - 如果是最后一次提交你还可以改正:

$ git commit --amend

这会取消最后一次提交,把工作分支回退到提交前标记了所有改动的状态,而且提交信息也都准备好可以修改或直接提交。

如果你已经提交过多次而且希望全部回退,你可以将分支重置到合适的位置。

$ git checkout feature132
$ git reset --hard HEAD~2

如果你实际上希望将分支指向一个完全不同的SHA1(也许你要将一个分支的HEAD替换到另一个分支,或者之后的某次提交)你可以使用下面的较长的方式:

$ git checkout FOO
$ git reset --hard SHA

实际上有一个快速的方式(不需要先把你的工作分支切换到FOO再前进到SHA):

$ git update-ref refs/heads/FOO SHA

18. 提交到了错误的分支

好吧,假如说你已经提交到了master,但却应该创建一个叫experimental的主题分支更合适。要移动这些改动,你可以在当前位置创建分支,回退HEAD再检出新分支:

$ git branch experimental   # 创建一个指向当前master的位置的指针
$ git reset --hard master~3 # 移动master分支的指针到3个版本之前
$ git checkout experimental

如果你的改动是在分支的分支的分支上会更复杂。那样你需要做的是将分支基础切换到其他地方:

$ git branch newtopic STARTPOINT
$ git rebase oldtopic --onto newtopic

19. 交互式切换基础

这是一个我之前看过展示却没真正理解过的很赞的功能,现在觉得它就很简单了。假如说你提交了3次但是你希望更改顺序或编辑(或者合并):

$ git rebase -i master~3

然后这会启动你的编辑器并带有一些指令。你所要做的就是修改这些指令来选择/插入/编辑(或者删除)提交和保存/退出。然后在编辑完后你可以用git rebase --continue命令来让每一条指令生效。

如果你有修改,将会切换到你提交时所处的状态,之后你需要使用命令git commit --amend来编辑。

注意:在rebase的时候千万不要提交 - 只能先添加然后使用参数--continue,--skip或--abort。

20. 清理

如果你提交了一些内容到你的分支(也许你从SVN导入了一些旧仓库),然后你希望把某个文件从历史记录中全部删掉:

$ git filter-branch --tree-filter 'rm -f *.class' HEAD

如果你已经推送到origin了,但之后提交了一些垃圾改动,你也可以在推送前在本地系统里这样做:

$ git filter-branch --tree-filter 'rm -f *.class' origin/master..HEAD

其他技巧

21. 你查看过的前一个引用

如果你知道自己之前查看过一个SHA-1,但是随后做了一些重置/回退的操作,你可以使用reflog命令来列出最近查看过的SHA-1记录:

$ git reflog
$ git log -g # 和上面一样,但是使用'log'格式输出

22. 分支命名

一个可爱的小技巧 - 别忘了分支名并不限于a-z和0-9。名字中可以用/和.将非常方便用来建立伪命名空间或版本,例如:

$ # 生成版本132的改动历史
$ git shortlog release/132 ^release/131
$ # 贴上v1.0.1的标签
$ git tag v1.0.1 release/132

23. 找出谁是凶手

通常找出来谁改动了某个文件里的某行代码会很有用。实现这个功能的最简单命令是:

$ git blame FILE

有时候这些改动来自其他文件(如果你合并了两个文件,或者你移动了某个函数)所以你可以使用下面的命令:

$ # 显示内容来自哪个文件
$ git blame -C FILE

有时候通过点击各个改动然后回到很早很早以前来跟踪改动会很不错。有一个很好的内建GUI命令来做这个:

$ git gui blame FILE

24. 数据维护

通常git不需要经常维护,它把自己照顾的很好。不过,你可以通过下面的命令查看数据统计:

$ git count-objects -v

如果占用很多空间的话,你可以选择在你的本地仓库做垃圾回收。这不会影响推送或其他人,却会让一些命令运行更快而且减少空间占用:

$ git gc

经常运行完整性检查也很有意义:

$ git fsck --full

你也可以在末尾加上--auto参数(如果你在服务器上通过crontab经常/每天都运行这个命令的话),然后它只会在必要的时候才执行fsck动作。

在检查的时候,看到“dangling”或“unreachable”是正常的,通常这是由回退HEAD或切换基础的结果。而看到“missing”或“sha1 mismatch”就不对了...找专业人士帮忙吧!

25. 恢复遗失的分支

如果你使用-D参数删除了experimental分支,可以用下面的命令重新建立:

$ git branch experimental SHA1_OF_HASH

如果你最近访问过的话,你通常可以用git reflog来找到SHA1哈希值。

另一种方式是使用git fsck —lost-found。其中一个dangling的提交就是丢失的HEAD(它只是已删除分支的HEAD,而HEAD 被引用为当前的HEAD所以它并不处于dangling状态)

搞定!

哇,这是我写过的最长的一篇博客,我希望有人能觉得有用。如果你这么觉得,或者你有任何疑问请在评论里留言让我知道...


via: https://www.andyjeffries.co.uk/25-tips-for-intermediate-git-users/

作者:Andy Jeffries 译者:zpl1025 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Prey是一款跨平台的开源工具,可以帮助你找回被盗的笔记本,台式机,平板和智能手机。它已经获得了广泛的流行,声称帮助找回了成百上千台丢失的笔记本和智能手机。Prey的使用特别简单,首先安装在你的笔记本或者手机上,当你的设备不见了,用你的账号登入Prey网站,并且标记你的设备为“丢失”。只要小偷将设备接入网络,Prey就会马上发送设备的地理位置给你。如果你的笔记本有摄像头,它还会拍下该死的贼。

Prey占用很小的系统资源;你不会对你的设备运行有任何影响。你也可以配合其他你已经在设备上安装的防盗软件使用。Prey在你的设备与Prey服务器之间采用安全加密的通道进行数据传输。

在Ubuntu上安装并配置Prey

让我们来看看如何在Ubuntu上安装和配置Prey,需要提醒的是,在配置过程中,我们必须到Prey官网进行账号注册。一旦完成上述工作,Prey将会开始监视你的设备了。免费的账号最多可以监视三个设备,如果你需要添加更多的设备,你就需要购买合适的的套餐了。

可以想象Prey多么流行与被广泛使用,它现在已经被添加到了官方的软件库中了。这意味着你不要往软件包管理器添加任何PPA。很简单,登录你的终端,运行以下的命令来安装它:

sudo apt-get install prey

Install Prey

Install Prey 1

Prey是十分轻巧的软件,只使用了系统几兆的空间,安装完成后,从Application >> Prey启动,之后它会询问你进行相关配置。

选择“New User”,如果你是第一次使用的话。

Prey New User

第二步实际上就是官网注册的流程。请提供你的用户名,邮箱地址和密码,来申清一个免费的账号。

Register Prey

点击“Apply”完成,所有工作搞定,现在你的计算机被Prey保护了。

Prey Configuration

登录你最新建立的Prey 账号,你就应该可以在“Devices”菜单下看见你的设备信息了。

Prey Web Login

只要你的笔记本或者任何其他设备丢失了,就登录你的Prey网站账号,然后点击“Set Device to Missing”选项修改设备状态为“missing”。

Prey Missing Page

从这里选择定时报告,并点击“Yes,my device is missing”。定时报告选项是指一段时间间隔后,软件会更新并发送给你设备的地理位置。它还会从网页界面那发邮件给你,只要设备的状态改变了。

Prey Missing Email

而一旦被盗的设备接入了互联网,Prey就会马上发送报告给你,包括设备的地理位置和IP地址。

Prey Found Report

点击报告链接,你应该会看到设备的地理位置和IP地址。

Prey Final

Prey有一个明显的不足。它需要你的设备接入互联网才会发送地理位置给你,如果小偷比较聪明,在接入网络前将你的设备磁盘格式化了,那么你就永远不会收到设备被发现的报告了。但是这里仍然是有一个方法克服这个不足,确保添加一个BIOS密码,并且禁用从可移除的设备里启动系统。

结论

这是一款小巧,非常有用的安全保护应用,可以让你在一个地方追踪你所有的设备,尽管不完美,但是仍然提供了找回被盗设备的机会。它在Linux,Windows和Mac平台上无缝运行。以上就是Prey完整使用的所有细节。


via: http://linoxide.com/ubuntu-how-to/anti-theft-application-prey-ubuntu/

作者:Aun Raza 译者:wi-cuckoo 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出