解决Git object file is empty fatal的故障

一 故障背景:

公司源码管理工具从SVN迁移到Git之后,Git源码服务器采用本地bitbucket托管。在一次bitbucket服务器所在虚拟主机由于存储空间吃紧,导致bitbucket意外宕机的故障之后。恢复虚拟主机,启动bitbucket之后,发现有某个项目的某个repository故障,导致开发同事无法提交代码,耽误事儿。

二 解决过程:

1 首先,在bitbucket上新建立1个项目工程以及repository给上述失败的项目使用;

2 其次,让该项目的开发同事,拿本地的git源码push到该新建的工程下对应的repository里;

3 然后,手工删除原故障的工程以及其下的所有repository,在控制台上进入该repository的时候,报错:

 

4 其次,再想办法如何解决该500错误:

‘/usr/local/git/bin/git cat-file -t refs/heads/master:’ exited with code 128 saying: error: object file ./objects/f4/22a78e5d8324e7c3fdaa5f9c88b02c7c7622dc is empty fatal: loose object f422a78e5d8324e7c3fdaa5f9c88b02c7c7622dc (stored in ./objects/f4/22a78e5d8324e7c3fdaa5f9c88b02c7c7622dc) is corrupt

 

 

a 进入bitbucket服务器的BITBUCKET_HOME,/data/atlassian/application-data/bitbucket下的 shared/data/repositories子目录:

[root@localhost repositories]# pwd

/data/atlassian/application-data/bitbucket/shared/data/repositories

[root@localhost repositories]# ll

总用量 508

drwxr-xr-x. 7 root root 4096 12月 13 23:20 100

drwxr-xr-x. 7 root root 4096 12月 13 23:21 101

drwxr-xr-x. 7 root root 4096 12月 13 23:20 105

drwxr-xr-x. 7 root root 4096 12月 13 23:21 107

drwxr-xr-x. 7 root root 4096 12月 13 23:20 108

drwxr-xr-x. 7 root root 4096 12月 13 23:20 115

drwxr-xr-x. 7 root root 4096 12月 13 23:21 116

drwxr-xr-x. 7 root root 4096 12月 13 23:21 117

drwxr-xr-x. 7 root root 4096 12月 13 23:21 118

drwxr-xr-x. 7 root root 4096 12月 13 23:20 119

drwxr-xr-x. 7 root root 4096 12月 13 23:20 120

drwxr-xr-x. 7 root root 4096 12月 13 23:21 121

drwxr-xr-x. 7 root root 4096 12月 13 23:21 122

drwxr-xr-x. 7 root root 4096 12月 13 23:21 123

drwxr-xr-x. 7 root root 4096 12月 13 23:20 124

drwxr-xr-x. 7 root root 4096 12月 13 23:21 125

drwxr-xr-x. 7 root root 4096 12月 13 23:20 126

drwxr-xr-x. 7 root root 4096 12月 13 23:21 127

drwxr-xr-x. 7 root root 4096 12月 13 23:20 128

drwxr-xr-x. 7 root root 4096 12月 13 23:21 129

drwxr-xr-x. 7 root root 4096 12月 13 23:21 13

drwxr-xr-x. 7 root root 4096 12月 13 23:20 130

drwxr-xr-x. 7 root root 4096 12月 13 23:20 131

drwxr-xr-x. 7 root root 4096 12月 13 23:21 132

drwxr-xr-x. 7 root root 4096 12月 13 23:21 133

drwxr-xr-x. 7 root root 4096 12月 13 23:20 134

drwxr-xr-x. 7 root root 4096 12月 13 23:20 135

drwxr-xr-x. 7 root root 4096 12月 13 23:21 136

drwxr-xr-x. 7 root root 4096 12月 13 23:21 137

drwxr-xr-x. 7 root root 4096 12月 13 23:20 138

drwxr-xr-x. 7 root root 4096 12月 13 23:21 139

drwxr-xr-x. 7 root root 4096 12月 13 23:20 140

drwxr-xr-x. 7 root root 4096 12月 13 23:21 141

drwxr-xr-x. 7 root root 4096 12月 13 23:20 142

drwxr-xr-x. 7 root root 4096 12月 13 23:20 143

drwxr-xr-x. 7 root root 4096 12月 13 23:21 144

drwxr-xr-x. 7 root root 4096 12月 13 23:20 145

drwxr-xr-x. 7 root root 4096 12月 13 23:21 146

drwxr-xr-x. 7 root root 4096 12月 13 23:20 147

drwxr-xr-x. 7 root root 4096 12月 13 23:21 148

drwxr-xr-x. 7 root root 4096 12月 13 23:20 149

drwxr-xr-x. 7 root root 4096 12月 13 23:21 15

drwxr-xr-x. 7 root root 4096 12月 13 23:21 150

drwxr-xr-x. 7 root root 4096 12月 13 23:20 153

drwxr-xr-x. 7 root root 4096 12月 13 23:21 154

drwxr-xr-x. 7 root root 4096 12月 13 23:21 156

drwxr-xr-x. 7 root root 4096 12月 13 23:21 157

drwxr-xr-x. 7 root root 4096 12月 13 23:21 158

drwxr-xr-x. 7 root root 4096 12月 13 23:20 159

drwxr-xr-x. 7 root root 4096 12月 13 23:21 16

drwxr-xr-x. 7 root root 4096 12月 13 23:21 166

drwxr-xr-x. 7 root root 4096 12月 13 23:20 167

drwxr-xr-x. 7 root root 4096 12月 13 23:21 168

drwxr-xr-x. 7 root root 4096 12月 13 23:21 169

drwxr-xr-x. 7 root root 4096 12月 13 23:21 170

drwxr-xr-x. 7 root root 4096 12月 13 23:21 171

drwxr-xr-x. 7 root root 4096 12月 13 23:20 172

drwxr-xr-x. 7 root root 4096 12月 13 23:20 173

drwxr-xr-x. 7 root root 4096 12月 13 23:21 174

drwxr-xr-x. 7 root root 4096 12月 13 23:21 175

drwxr-xr-x. 7 root root 4096 12月 13 23:21 176

drwxr-xr-x. 7 root root 4096 12月 13 23:21 177

drwxr-xr-x. 7 root root 4096 12月 13 23:20 178

drwxr-xr-x. 7 root root 4096 12月 13 23:20 179

drwxr-xr-x. 7 root root 4096 12月 13 23:21 180

drwxr-xr-x. 7 root root 4096 12月 13 23:21 181

drwxr-xr-x. 7 root root 4096 12月 13 23:20 182

drwxr-xr-x. 7 root root 4096 12月 13 23:21 183

drwxr-xr-x. 7 root root 4096 12月 13 23:20 184

drwxr-xr-x. 7 root root 4096 12月 13 23:21 185

drwxr-xr-x. 7 root root 4096 12月 13 23:21 186

drwxr-xr-x. 7 root root 4096 12月 13 23:20 187

drwxr-xr-x. 7 root root 4096 12月 13 23:21 188

drwxr-xr-x. 7 root root 4096 12月 13 23:21 189

drwxr-xr-x. 7 root root 4096 12月 13 23:21 190

drwxr-xr-x. 7 root root 4096 12月 13 23:21 192

drwxr-xr-x. 7 root root 4096 12月 13 23:21 193

drwxr-xr-x. 7 root root 4096 12月 13 23:21 194

drwxr-xr-x. 7 root root 4096 12月 13 23:21 195

drwxr-xr-x. 7 root root 4096 12月 13 23:20 196

drwxr-xr-x. 7 root root 4096 12月 13 23:21 197

drwxr-xr-x. 7 root root 4096 12月 13 23:21 27

drwxr-xr-x. 7 root root 4096 12月 13 23:21 28

drwxr-xr-x. 7 root root 4096 12月 13 23:20 29

drwxr-xr-x. 7 root root 4096 12月 13 23:21 3

drwxr-xr-x. 7 root root 4096 12月 13 23:21 40

drwxr-xr-x. 7 root root 4096 12月 13 23:21 41

drwxr-xr-x. 7 root root 4096 12月 13 23:20 47

drwxr-xr-x. 7 root root 4096 12月 13 23:21 51

drwxr-xr-x. 7 root root 4096 12月 13 23:21 52

drwxr-xr-x. 7 root root 4096 12月 13 23:21 53

drwxr-xr-x. 9 root root 4096 12月 13 23:21 56

drwxr-xr-x. 7 root root 4096 12月 13 23:21 57

drwxr-xr-x. 7 root root 4096 12月 13 23:21 58

drwxr-xr-x. 7 root root 4096 12月 13 23:21 59

drwxr-xr-x. 7 root root 4096 12月 13 23:21 60

drwxr-xr-x. 7 root root 4096 12月 13 23:21 61

drwxr-xr-x. 7 root root 4096 12月 13 23:20 62

drwxr-xr-x. 7 root root 4096 12月 13 23:21 63

drwxr-xr-x. 7 root root 4096 12月 13 23:21 64

drwxr-xr-x. 7 root root 4096 12月 13 23:20 65

drwxr-xr-x. 9 root root 4096 12月 13 23:21 66

drwxr-xr-x. 7 root root 4096 12月 13 23:21 67

drwxr-xr-x. 7 root root 4096 12月 13 23:20 68

drwxr-xr-x. 7 root root 4096 12月 13 23:21 69

drwxr-xr-x. 7 root root 4096 12月 13 23:20 70

drwxr-xr-x. 7 root root 4096 12月 13 23:21 71

drwxr-xr-x. 7 root root 4096 12月 13 23:21 72

drwxr-xr-x. 7 root root 4096 12月 13 23:20 73

drwxr-xr-x. 7 root root 4096 12月 13 23:21 74

drwxr-xr-x. 7 root root 4096 12月 13 23:21 75

drwxr-xr-x. 7 root root 4096 12月 13 23:21 81

drwxr-xr-x. 7 root root 4096 12月 13 23:21 82

drwxr-xr-x. 7 root root 4096 12月 13 23:21 83

drwxr-xr-x. 7 root root 4096 12月 13 23:20 84

drwxr-xr-x. 7 root root 4096 12月 13 23:21 85

drwxr-xr-x. 7 root root 4096 12月 13 23:21 86

drwxr-xr-x. 7 root root 4096 12月 13 23:21 87

drwxr-xr-x. 7 root root 4096 12月 13 23:20 88

drwxr-xr-x. 7 root root 4096 12月 13 23:20 89

drwxr-xr-x. 7 root root 4096 12月 13 23:21 90

drwxr-xr-x. 7 root root 4096 12月 13 23:21 91

drwxr-xr-x. 7 root root 4096 12月 13 23:21 92

drwxr-xr-x. 7 root root 4096 12月 13 23:21 93

drwxr-xr-x. 7 root root 4096 12月 13 23:20 94

drwxr-xr-x. 7 root root 4096 12月 13 23:20 98

drwxr-xr-x. 7 root root 4096 12月 13 23:21 99

[root@localhost repositories]#

b 查找哪个repository包含上述报错的“22a78e5d8324e7c3fdaa5f9c88b02c7c7622dc”关键字

[root@localhost repositories]# find  ./ |xargs grep -ri “22a78e5d8324e7c3fdaa5f9c88b02c7c7622dc”

./66/refs/heads/master:f422a78e5d8324e7c3fdaa5f9c88b02c7c7622dc

./66/refs/heads/master:f422a78e5d8324e7c3fdaa5f9c88b02c7c7622dc

./66/refs/heads/master:f422a78e5d8324e7c3fdaa5f9c88b02c7c7622dc

./66/refs/heads/master:f422a78e5d8324e7c3fdaa5f9c88b02c7c7622dc

[root@localhost repositories]#

 

c 执行git fsck

[root@localhost repositories]# cd 66

[root@localhost 66]# git fsck

检查对象目录中: 100% (256/256), 完成.

error: object file ./objects/1a/d1162a6381f39960d7efb38aee8e989965489e is empty

error: object file ./objects/1a/d1162a6381f39960d7efb38aee8e989965489e is empty

fatal: loose object 1ad1162a6381f39960d7efb38aee8e989965489e (stored in ./objects/1a/d1162a6381f39960d7efb38aee8e989965489e) is corrupt

[root@localhost 66]#

d 然后到控制台,依然报错(此步骤非必须):

 

e 删除包含关键字为66的repository:

[root@localhost repositories]# rm -rf 66

[root@localhost repositories]#

f 最后到控制台上删除包含错误的repository以及其工程project。

删除之后,之前报错的repository不再出现。

三 小结解决思路

1在Git服务器上创建新的项目和对应的repository;

2 手工把本地源码push到该新建的项目下;

3 删除出错的旧工程及其所有的repository;

4 删除出错,可以到Git服务器的BITBUCKET_HOME,/data/atlassian/application-data/bitbucke/shared/data/repositories子目录下,通过将包含错误信息的repository手工删除来处理。

Linux环境设置zookeeper、memcached、activemq、dubbo自动启动

一 zookeeper

1 修改zkServer.sh(/usr/local/zookeeper-3.4.5/bin/zkServer.sh)文件的第一行:

#!/usr/bin/env bash

为:

#!/bin/bash

# description: Zookeeper Start Stop Restart

# processname: zookeeper

# chkconfig: 244 30 80

 

2 修改:

# use POSTIX interface, symlink is followed automatically

ZOOBIN=”${BASH_SOURCE-$0}”

ZOOBIN=`dirname ${ZOOBIN}`

ZOOBINDIR=`cd ${ZOOBIN}; pwd`

 

if [ -e “$ZOOBIN/../libexec/zkEnv.sh” ]; then

# use POSTIX interface, symlink is followed automatically

ZOOSH=`readlink $0`

ZOOBIN=`dirname $ZOOSH`

ZOOBINDIR=`cd $ZOOBIN; pwd`

ZOO_LOG_DIR=`echo $ZOOBIN`

 

if [ -e “$ZOOBIN/../libexec/zkEnv.sh” ]; then

 

3 创建软链接:

[root@dev-middleware ~]# ln -s /usr/local/zookeeper-3.4.5/bin/zkServer.sh  /etc/init.d/zookeeper

 

4 添加自动启动

[root@dev-middleware ~]# chkconfig –list zookeeper

zookeeper 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig –add zookeeper”)

[root@dev-middleware ~]# chkconfig –add zookeeper

[root@dev-middleware ~]# chkconfig –level 2345 zookeeper on

[root@dev-middleware ~]# chkconfig –list zookeeper

zookeeper       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@dev-middleware ~]#

 

5 参考

http://positivealex.github.io/blog/posts/how-to-install-zookeeper-as-service-on-centos/

二 memcached

[root@dev-middleware ~]# chkconfig –list memcached

memcached 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig –add memcached”)

[root@dev-middleware ~]# chkconfig –add memcached

[root@dev-middleware ~]# chkconfig –level 2345 memcached on

[root@dev-middleware ~]# chkconfig –list memcached

memcached       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@dev-middleware ~]#

三 activemq

1 修改文件activemq (/usr/local/apache-activemq-5.9.0/bin/activemq),第1行:

#!/bin/sh

为:

#!/bin/sh

### BEGIN INIT INFO

# Provides:             activemq

# Required-Start:       $remote_fs $syslog

# Required-Stop:        $remote_fs $syslog

# Default-Start:        2 3 4 5

# Default-Stop:         0 6

# Short-Description:    ActiveMQ server

### END INIT INFO

 

2 创建软链接:

[root@dev-middleware bin]# ln -s /usr/local/apache-activemq-5.9.0/bin/activemq /etc/init.d/activemq

[root@dev-middleware bin]#

 

3 添加自动启动

[root@dev-middleware bin]# chkconfig –list activemq

activemq 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig –add activemq”)

[root@dev-middleware bin]# chkconfig –add activemq

[root@dev-middleware bin]# chkconfig –level 2345 activemq on

[root@dev-middleware bin]# chkconfig –list activemq

activemq        0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@dev-middleware bin]#

 

4 参考

http://www.liaoxuefeng.com/article/0013738918072162b1c2a36eb0f40e690d3902acf60c8fb000

四 dubbo

 

[root@dev-middleware ~]# ll /etc/init.d/tomcat-dubbo-admin

-rwxr-xr-x 1 root root 1969 9月   8 13:49 /etc/init.d/tomcat-dubbo-admin

[root@dev-middleware ~]# /etc/init.d/tomcat-dubbo-admin

start/stop

[root@dev-middleware ~]# chkconfig –list tomcat-dubbo-admin

tomcat-dubbo-admin 服务支持 chkconfig,但它在任何级别中都没有被引用(运行“chkconfig –add tomcat-dubbo-admin”)

[root@dev-middleware ~]# chkconfig –add tomcat-dubbo-admin

[root@dev-middleware ~]# chkconfig –level 2345 tomcat-dubbo-admin on

[root@dev-middleware ~]# chkconfig –list tomcat-dubbo-admin

tomcat-dubbo-admin      0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@dev-middleware ~]#

Linux环境配置SFTP小结

说明:简明扼要的记录在Linux环境上配置SFTP的注意事项,主要是自己在该问题的小细节上犯过几次同样的错误,我必须要动手把它记录、写下来,自己还要时不时的翻看一下,避免在同样的问题上连续跌倒(*^__^*)

一 配置步骤

1.创建SFTP用户组

groupadd sftp

2.添加用户并设置为sftp

 useradd -g sftp -s /sbin/nologin -M  sftpUser

其中:(/sbin/nologin为禁止登录shell的用户,即该用户sftpUser无法获取shell,也就限制其登录主机)

3.设置用户密码

passwd sftpUser

4.创建用户目录,并设置权限

cd /home

mkdir sftpUserDir

chown root:sftp sftpUserDir

chmod 755 sftpUserDir

这里:设置sftp用户sftpUser将来通过SFTP来上传、下载的目录为/home/sftpUserDir。同时,设置该目录目录/home/sftpUserDir的所属用户和组为root:sftp,且其权限务必为755,否则SFTP会报错!

5.修改SSH配置

修改/etc/ssh/sshd_config配置文件

修改Subsystem为:

Subsystem sftp internal-sftp

6.sshd_config添加用户配置

Match User sftpUser  #配置允许SFTP操作的用户名为sftpUser

Match Group sftp   #配置允许SFTP操作的用户组为sftp

X11Forwarding no

AllowTcpForwarding no

ForceCommand internal-sftp

ChrootDirectory /home/sftpUserDir  #配置用户的根目录

说明:Match User sftpUser和Match Group sftp的配置,可以有选择性的配置,也可以组合配置。中间3行为允许SFTP转发的配置。

7.最后重启SSH

/etc/init.d/ssh restart

二 验证测试

在其它的机器上执行:

sftp sftpUser@SFTP_server_IP

三 小结

1  ChrootDirectory 的所有父目录的权限最高只能是755 ,否则会抛出下述错误!

Read from remote host 172.16.xx.xxx: Connection reset by peer

Couldn’t read packet: Connection reset by peer

2 SFTP Permission denied处理

com.jcraft.jsch.SftpException: Permission denied

问题的原因是,SFTP服务器的SELINUX没关闭。

解决办法:

查看SELINUX的配置:getenforce

关闭SELINUX:setenforce 0

 勿以善小而不为,不要以为不起眼的小问题就不够引起你对它的重视。

Linux环境SSH免密配置小结

场景:

Server a:IP 为172.16.6.1上有1个用户root;

Server b:Ip为172.16.6.2上有3个用户root、tomcat、deploy;

Q1:

Server a上能不能配置以tomcat、deploy通过SSH免密登录到Server b ?

A1:

完全可以。在1台机器上,能否以某个指定用户通过SSH免密登录到另外1台目标机器上,与当前机器上是否存在该指定用户无关。这一点是我之前不曾知道的,总以为,发起SSH请求的机器上也必须要有对应的用户存在。从前,在配置Oracle RAC数据库时,多个节点上都有oracle用户存在,在配置oracle用户SSH免密登录的时候,产生的误区就是以为SSH免密登录的场景下,源端和目标端都必须要有对应的用户存在。原来,自己误导自己已多年。

Q2:

如何配置Q1上所说的免密登录?

A2:

1

Server a上,以root依次执行:

ssh-keygen –t rsa;

ssh-keygen –t dsa;

分别生成RSA、DSA加密算法的秘钥。否则可能会遭遇下述错误:

/usr/bin/ssh-copy-id: ERROR: No identities found

2

ssh-copy-id tomcat@172.16.6.2

ssh-copy-id deploy@172.16.6.2

依次执行上还命令。且分别输入tomcat、deploy用户的口令。

3

当前机器上以root用户执行 ssh tomcat@172.16.6.2 即可实现以tomcat的身份执行SSH免密登录到172.16.6.2机器上。deploy用户同。

Q3

上述场景里,假设Server a上也有tomcat、deploy用户存在,且已经配置完成可以以root用户发起,向Server b的ssh tomcat@172.16.6.2的免密登录的前提下,那么在Server a上以tomcat用户发起向Server b的ssh tomcat@172.16.6.2的免密登录可行吗

A3

绝对不可以。如果需要在Server a上以tomcat用户发起向Server b的ssh tomcat@172.16.6.2的免密登录,那么必须在Server a上,以tomcat用户登录,重新执行上述A2的免密登录配置。

 

小结:

1 源端机器发起向目标端机器的免密登录,源端机器上是否存在与目标端机器上的SSH用户无关;如:源端机器上只有root用户,即使不存在tomcat用户,那么也可以以root用户发起ssh tomcat@目标机器的免密登录;

2 即使源端机器可以以u1用户执行ssh u2@目标机器IP的免密登录,那么源端机器的u2用户也不一定能够顺利执行ssh u2@目标机器IP的免密登录。这取决于,源端机器上的u2用户,是否已经配置SSH到目标机器的免密登录。