解决git clone --recursive部分失败后继续检出代码

在使用如下命令检出Vulkan的时候,发生失败,Vulkan的代码已经成功检出,但是子模块没有完成

$ git clone --recursive https://github.com/SaschaWillems/Vulkan.git

提示的出错信息如下:

warning: 克隆成功,但是检出失败。
您可以通过 'git status' 检查哪些已被检出,然后使用命令
'git checkout -f HEAD' 重试

可以使用如下命令继续检出子模块:

$ git submodule update --init --recursive --progress

ubuntu 16.04执行git clone时失败“RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.”

前几天从github下载代码的时候,一直失败,提示如下:

$ git clone http://github.com/myriadrf/LimeSuite.git
正克隆到 'LimeSuite'...
remote: Counting objects: 13921, done.
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: The remote end hung up unexpectedly
fatal: 过早的文件结束符(EOF)
fatal: index-pack failed

如果操作系统的语言是英文的话,输出如下内容:

error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

刚刚开始以为是由于GnuTLSBUG导致的。

当时的解决方法是翻墙出去进行克隆。或者用Windows进行克隆操作。

然而,从最近的新闻来看,更像是遭受了攻击导致的。

继续阅读ubuntu 16.04执行git clone时失败“RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.”

Ubuntu 16.04下同步github中fork出来的分支

githubfork出一些感觉比较好的项目,已经做了部分修改,由于某些原因,无法通过pull request合并到原作者的分支,但是想把原项目的最近更新代码合并进来,可以通过git fetch原始项目到本地,通过git merge的进行代码合并。

fork出来的pyseeta项目为例

  • 检出自己的代码
$ git checkout https://github.com/wangqiang1588/pyseeta.git
  • 把原作者项目地址添加到刚刚检出的项目
$ git remote add upstream https://github.com/TuXiaokang/pyseeta.git
  • 从原作者仓库获取到分支,及相关的提交信息
$ git fetch upstream
  • 切换到想合并代码的分支
$ git checkout master
  • 代码合并,并解决冲突
$ git merge upstream/master
  • 提交合并后的代码
$ git commit -m "merge ......."
  • 推送提交到远程服务器
$ git push

参考链接


如何同步 Github fork 出来的分支

使用Git Submodule管理子模块

我们经常会引用第三方的开源项目或者其他人的项目到自己的项目中来,如果直接拷贝代码,那么就需要每次他人修改后,手工同步代码,导致整个的工作量非常大。git submodule使得我们可以把他人的项目作为我们自己的子项目来进行管理,当对方修改后,一个简单的同步命令就可以完成代码的自动同步,方便我们的开发。添加一个项目到我们的工程中,比如:

$ git submodule add git@github.com:jjz/pod-library.git pod-library

检出主工程代码后,初始化子模块(需要手工执行)

$ git submodule update --init --recursive

更新同步子模块的代码:

$ git submodule update --recursive --remote

删除子模块的代码:

$ git submodule deinit pod-library
 
$ git rm -f pod-library

$ rm -rf .git/modules/pod-library

参考链接


git删除未监视的文件(untracked files)命令用法

gitLinux下删除未监视的文件(untracked files),一般通过命令来执行更方便,具体执行如下:

# 删除 untracked files
$ git clean -f

# 连 untracked 的目录也一起删掉
$ git clean -fd

# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
$ git clean -xfd

# 在用上述 git clean 前,建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
$ git clean -nxfd
$ git clean -nf
$ git clean -nfd

一般执行

$ git clean -xfd

即可。

TortoiseGit 2.4.0.2引入了一个新的BUG,导致无法提交,提示“fatal: protocol error: bad line length character: Welc”

今天(2017.02.27TortoiseGit 2.4.0发布了一个Hotfix来修正几个BUG,网站上的具体的版本信息如下:

2017-02-25 | Released TortoiseGit Hotfix 2.4.0.2 (fixes issue #2909 (Commit dialog unclosable) and issue #2911 (Add returns "invalid path") and contains PuTTY 0.68)

但是这次的修复引入了更大的BUG,导致无法提交代码,不管是拉取还是提交代码,都会提示"fatal: protocol error: bad line length character: Welc",如下图:

修复这个问题最简单的方法就是还原到TortoiseGit 2.4.0版本。

这个BUG是由TortoiseGitPlink.exe里面的代码改动引起的,只要还原这个文件到0.67版本(来自TortoiseGit 2.4.0),也可以解决这个问题。

目前已经提交了BUG给开发人员了。对于的BUG链接地址如下:
TortoiseGit 2.4.0.2 bug ( TortoiseGit 2.4.0 works but TortoiseGit 2.4.0.2 can not pull and push) "fatal: protocol error: bad line length character: Welc"

希望能尽快修复这个问题吧!

到目前为止(2017.05.09)这个问题依旧没有修复的可能,因此建议大家可以改用一下SourceTree-2.0.20.1,可以点击这里下载目前最新的版本。

TortoiseGit 与 Putty 配置冲突导致 Server refuse our key

TortoiseGitTortoiseSVNGit版本,TortoiseGit用于迁移TortoiseSVNTortoiseGit,一直以来GitWindows平台没有好用GUI客户端,现在TortoiseGit的出现给Windows开发者带来福音

TortoiseGit原本用得好好的,一日安装了Putty后,问题出现了。。

在进行git操作时提示:

TortoisePLink fatal error
Disconnected: no supported authentication methods available
(server sent publickey)

TortoiseGit版本信息:

TortoiseGit 1.8.3.0 (C:/Program Files/TortoiseGit/bin/TortoiseGitProc.exe)
git version 1.8.1.msysgit.1 (C:/Program Files (x86)/Git/bin)

因为TortoiseGit调用了由Putty修改而来的TortoisePLink,因此Putty的配置将会影响TortoiseGit

解决方法,删除注册表中的以下节点即可:

HKEY_CURRENT_USER/Software/SimonTatham/PuTTY/Sessions/Default%20Settings

参考链接:


TortoiseGit 与 Putty 配置冲突导致 Server refuse our key

Git常用命令

Git检出使用SSH-KEY认证的服务器上的源代码:(注意,此处SSH-KEY只能使用绝对路径)

$ssh-agent bash -c 'ssh-add /home/longsky/ssh_keys/theuser;git clone git@github.com:TheUser/TheProject.git'

Git提交更改

$git add *
$git commit -m "代码提交信息"

Git提交代码到使用SSH-KEY认证的服务器master分支:(注意,此处SSH-KEY只能使用绝对路径)

$ssh-agent bash -c 'ssh-add /home/longsky/ssh_keys/theuser;git push origin master'

参考链接:


git - 简易指南
specify private SSH-key to use when executing shell command with or without Ruby?

Windows下使用命令行执行需要用SSH keys登录的Git

Windows下使用Git的时候,大家都习惯了使用TortoiseGit来执行操作。但是在某些情况下,必须在Git Bash下面执行命令的时候,就比较麻烦了,尤其是服务器设置了SSH keys登陆的时候。默认情况下,TortoiseGit会自动加载puttygen生成的.PPK文件来完成认证工作,但是在Git Bash 下面,只能是根据Linux下面的配置来进行登陆认证了。

1.在Git Bash中输入“puttygen”,如下图所示:puttygen
弹出如下图形界面:putty_key_generator
对于已经有PPK文件的情况,点击"Load"来加载,没有PPK文件,请点击"Generate"来生成。加载完成后,点击菜单上的“Conversions”按钮,如下图所示:export_openssh_key

导出的文件没有扩展名,命名为“id_rsa”,注意,必须是这个名字,没有扩展名。

2.拷贝文件“id_rsa”到当前用户目录下面的 “.ssh”目录下面,当前用户目录的位置,请在Git Bash中输入“echo ~”来显示出来,最后的结果如下图所示id_rsa

3.在Git Bash中继续执行命令,就可以了!