iT邦幫忙

0

自製網頁git推收(push-pull)小程式

大家好~

雖說這篇是發佈於"發問"
但..我希望它更像是請大家一起來研究研究問題~

一個月前~
我開始學習git的架構與操作
現在的我~對git的概念算是中等程度了

我本身有在學習前後端設計(ExtJs.PHP)
而git的操作都是以命令提示字元(Linux是終端機)
(我的環境是Windows..不過我還是有用VM嫁了Linux來玩)

我的想法是...
想設計一個像是表單的方式..
輸入要commit的敘述或是tag的名稱..
只要一個送出(或是推送)按鈕
就可以完成所有git推送的步驟..
(add -> commit -> push)

另外...
再設計一個頁面(功能為更新用)
概念有點像市面上的軟體更新一樣~
一個更新按鈕..按下後..
就自動執行(git pull)將本機的程式庫進行差異更新~
更進階的做法是..
再做一個Grid顯示遠端倉儲有發布的歷次tag資料~
並可以讓使用者~選擇要更新(或回退)的版本

其實更新功能我有做出來~(包含選版本更新)
但是卻一直卡在push功能上...
我執行時..
前面的add到commit都能成功
直到執行push時..
網頁畫面就出現錯誤訊息了..如下..

Fatal error: Uncaught exception 'Exception' with message 'Logon failed, use ctrl+c to cancel basic credential prompt. bash: /dev/tty: No such device or address error: failed to execute prompt script (exit code 1) fatal: could not read Username for 'http://192.168.230.22:10080/': Invalid argument ' in C:\AppServ\www\testsys\MyExtJS\Git-PHP\Git.php:317 Stack trace: #0 C:\AppServ\www\testsys\MyExtJS\Git-PHP\Git.php(334): GitRepo->run_command('git push --tags...') #1 C:\AppServ\www\testsys\MyExtJS\Git-PHP\git-push.php(8): GitRepo->run('push --tags ori...') #2 {main} thrown in C:\AppServ\www\testsys\MyExtJS\Git-PHP\Git.php on line 317

我也大概理解是因為登入憑證的關係..
我也試著再加入code..
$repo->run('user.name');
$repo->run('user.password');
還是有出現一樣的錯誤訊息

問問大家該怎麼解決??

https://drive.google.com/open?id=0B6wJROo66PxvZktBdE1GaEI3OVE

上面的連結是我自己從網路上找到並加以修改的程式
開放給大家試試~
程式內有一兩個路徑需要做點修改~
有問題儘管發問~
我知道的我也會解答唷~^^

謝謝大家~!!

看更多先前的討論...收起先前的討論...
weiclin iT邦高手 4 級 ‧ 2016-12-19 14:39:20 檢舉
為什麼程式碼不放 github 呢
因為這套程式是來自github的某個創作者
雖說github本身就是開放平台
不過為了尊重創作者
所以才放在自己的雲端的
https://github.com/kbjr/Git.php
上面網址是git php最原始的創作者github
內容其實差不了多少~
weiclin iT邦高手 4 級 ‧ 2016-12-19 15:05:57 檢舉
上面有放 license 啊, MIT 跟 GPL 不用客氣直接 fork 就好
對不起~我不懂您的意思耶~(汗

我知道有那個license....
但是....當初...因為英文...太長....
所以....沒有看....直接自己看程式碼研究....=_=(汗
weiclin iT邦高手 4 級 ‧ 2016-12-19 19:00:44 檢舉
我的意思是他的 license 允許你複製一份去修改或是放到自己的 github
fillano iT邦超人 1 級 ‧ 2016-12-20 00:16:21 檢舉
而且如果有改進,還可以發pull request。基本上github的文化是歡迎複製並改進的(沒改進也沒關係啦)。
fillano iT邦超人 1 級 ‧ 2016-12-20 00:31:01 檢舉
.git/config長怎樣?在命令列操作時,是怎樣做驗證的?
我的.git/config內容如下...
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = http://192.168.230.22:10080/kenny/testsys.git
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = http://192.168.230.22:10080/kenny/testsys.git
pushurl = http://192.168.230.22:10080/king742171/testsys.git
[branch "master"]
remote = origin
merge = refs/heads/master

我的pushurl有兩個
是因為想測試git push可以一次傳兩個不同網段的遠端倉儲
事實可以成功~

另外...
我再命令列的操作....
因為我操作的系統是windows...
再命令提示字元操作時..
因為一開始有下過指令...
"git config --global user.name "king742171""
"git config --global user.email "king742171@gmail.com""
所以在憑證上...
下git push後會直接通過...不會過問..
我已經有再程式端加入..
"$repo->run('config --global user.name "king742171"'); "
"$repo->run('config --global user.email "king742171@gmail.com"'); "
執行程式後可以通過..
但是依舊卡在push的程式上..
而且錯誤訊息一樣...

補充一點..
我也有嘗試過Linux(Ubuntu)
Linux比較特殊..
也許是因為他本身系統設計就比較嚴謹..
所以在終端機上下指令..
只要牽扯到有寫入或修改的指令..
就得在前面加上sudo..例如..sudo git push
隨後會要求輸入管理者密碼
程式端的部分..
當然也是過加上sudo
當然也加入密碼....
結果一樣...
fillano iT邦超人 1 級 ‧ 2016-12-20 10:44:52 檢舉
push到遠端時不做驗證嗎?(帳號/密碼)
fillano iT邦超人 1 級 ‧ 2016-12-20 10:53:11 檢舉
你給的程式,我沒看到有輸入帳號密碼的地方...Git.php程式只處理了stdout跟stderr,沒有處理stdin,所以事實上你也不可能輸入密碼...

雖然不安全,但是帳密可以加在url上,你先試試看。
就兩個系統來說...
以指令的方式做push...
只要一開始有執行以下兩行..
後面的push或是pull都不用再額外打指令驗證~
(以下兩行只有在一開始建立環境時才執行..也就是只有執行一次)
"git config --global user.name "king742171""
"git config --global user.email "king742171@gmail.com""

但是回到用程式做(php)
就會出現我文章所說的錯誤訊息....
也就是疑似驗證問題...

現在想請問的問題是....
再程式上(php)
該如何做修改...才能解決這項錯誤~
讓網頁echo出我push成功的資訊~

ps:
push成功訊息有兩種
一種是"Already up-to-date" :: 表示遠端倉儲已經push至最新
一種是根據本地與遠端的差異進行更新,並列出相關更新訊息
那我要怎麼修改程式呢?

目前的git-push.php
只有這行做push指令
$repo->run('push --tags origin master');
或是
$repo->run_command('git push --tags origin master');

您說的在url之後加上帳密
怎麼加呢?
fillano iT邦超人 1 級 ‧ 2016-12-20 11:41:02 檢舉
加在.git/config裡面的url中:username:password@url
fillano iT邦超人 1 級 ‧ 2016-12-20 11:48:34 檢舉
不然就參考http://php.net/manual/en/function.proc-open.php來改一改Git.php,看看是否可以讓你透過寫入stdin的方式輸入密碼。
我成功了~!!!!!!!

太感謝您了~卡了三天三夜...都想唱歌了~ ╮╯▽╰╭

我用了再url加上帳密~
因為這套用法只會使用再區網~
而且只有特定幾個人會使用~
所以安全性應該沒問題~

使用方法也得要注意~
拿github作範例~(https://github.com/kbjr/Git.php)
再協定後加上「帳號:密碼@」
格式如下...
https://帳號:密碼@github.com/kbjr/Git.php

另外要注意的是..
帳號以及密碼內不能有特殊符號~~
例如@、.、, ........

像我帳號原本是個gmail
我試後發現不行~
就嘗試將@gmail.com拿掉~
就解決了~

不過還有一個小問題~
雖不足以造成程式無法運作...
卻無法讓我做更進階的判斷~

就是git push執行後該顯示的資訊~完全沒有~= =
是還可以下git status做判斷~
可是如果是拿git push的結果資訊做判斷會更簡單~

尚未有邦友回答

立即登入回答