git push上傳程式碼到gitlab上,報錯401/403(或需要輸入使用者名稱和密碼)

散盡浮華發表於2016-11-30

 

之前部署的gitlab,採用ssh方式連線gitlab,在客戶機上產生公鑰上傳到gitlab的SSH-Keys裡,git clone下載和git push上傳都沒問題,這種方式很安全。

後來應開發同事要求採用http方式連線gitlab,那麼首先將project工程的“Visibility Level”改為“Public”公開模式,要保證gitlab的http埠已對客戶機開放。

後面發現了一個問題:
http方式連線gitlab後,git clone下載沒有問題,但是git push上傳有報錯:
error: The requested URL returned error: 401 Unauthorized while accessing http://git.xqshijie.net:8081/weixin/weixin.git/info/refs
fatal: HTTP request failed

或者
The requested URL returned error: 403 Forbidden while accessing

例項如下:
假設git的url為http://git.wangshibo.net
[root@test-huanqiu ~]# mkdir /root/git
[root@test-huanqiu ~]# cd /root/git
[root@test-huanqiu git]# git init .
[root@test-huanqiu git]# git clone http://git.wangshibo.net:8081/weixin/weixin.git
Initialized empty Git repository in /root/git/weixin/.git/
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (10/10), done.

上面可以看出,已經能成功git clone下程式碼
[root@test-huanqiu git]# ll
total 4
drwxr-xr-x. 3 root root 4096 Nov 30 15:58 weixin
[root@test-huanqiu git]# cd weixin/
[root@test-huanqiu weixin]# ll
total 8
-rw-r--r--. 1 root root 15 Nov 30 15:58 heihei
-rw-r--r--. 1 root root 1 Nov 30 15:38 README.md

現在測試下git push
[root@test-huanqiu weixin]# git rm heihei
[root@test-huanqiu weixin]# touch test.file
[root@test-huanqiu weixin]# echo "123456" > test.file
[root@test-huanqiu weixin]# git add .
[root@test-huanqiu weixin]# git commit -m "this is a test"
[root@test-huanqiu weixin]# git push                                      //或者git push -u origin master
error: The requested URL returned error: 401 Unauthorized while accessing http://git.wangshibo.net:8081/weixin/weixin.git/info/refs

fatal: HTTP request failed

解決辦法:
在程式碼的.git/config檔案內[remote "origin"]的url的gitlab域名前新增gitlab註冊時的“使用者名稱:密碼@
另外發現這個使用者要在對應專案下的角色是Owner或Master才行,如果是Guest、Reporter、Developer,則如下操作後也是不行。
如下,gitlab的使用者名稱是wangshibo,假設密碼是HU@wew12378!h8

檢視gitlab介面裡的登陸使用者名稱:

然後修改程式碼裡的.git/config檔案
[root@test-huanqiu weixin]# cd .git
[root@test-huanqiu .git]# cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://git.wangshibo.net:8081/weixin/weixin.git
[branch "master"]
remote = origin
merge = refs/heads/master

修改如下:
[root@test-huanqiu .git]# cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://wangshibo:HU@wew12378!h8@git.wangshibo.net:8081/weixin/weixin.git
[branch "master"]
remote = origin
merge = refs/heads/master

然後再次git push,發現可以正常提交了!
[root@test-huanqiu weixin]# git push
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://wangshibo:HUIhui1987521@git.xqshijie.net:8081/weixin/weixin.git
8fcb559..6c97b56 master -> master

------------------------------------------------------------------------------------------------------------------------------------
可以建立一個使用者名稱作為admin管理員,然後將這個使用者名稱和密碼新增到專案程式碼的.git/config裡面,如上操作!
如果不是管理員,則至少對當前程式碼具有owner或master許可權。

這樣,在.git/config檔案裡新增這個使用者名稱和密碼許可權,然後其他人在git push的時時候都使用這個檔案進行覆蓋。

其他人在首次git clone下載程式碼的時候,需要進行--global全域性配置,然後就可以在gitweb控制檯裡追蹤到每個操作者的提交記錄了!

相關文章