瀏覽標籤:

Git

[IIS][GitLab] 利用 IIS Reverse Proxy 將 GitLab 加上 Https

最近工作上有個需求要將 GitLab 掛上 SSL 憑證,原本就有一台 Windows Server 在管理所有的 SSL 憑證,於是乎就想到可以利用 IIS Reverse Proxy 的方式將憑證集中管理在這台,這樣管理起來也比較方便。

前置作業

首先需要安裝兩個模組

  1. URL Rewrite
  2. Application Request Routing

安裝 URL Rewrite 的時候有踩到一個地雷,詳情請見 [IIS] Windows Server 2016 安裝 URL Rewrite 憑證失效

開始設定

  1. 建立一個新站台並設定好 SSL 憑證 (由於這邊我只是測試用,所以我自己簽一個自我憑證)

  2. 選擇 URL Rewrite

  3. 選擇 新增規則 -> 反向 Proxy

  4. 選擇 確定 啟用 Proxy

  5. 1 的地方輸入 GitLab 的位置,2 的位置輸入欲對外的 Domain

  6. 當我以為簡單就完成開啟網頁試試時卻噴錯誤給我看

HTTP 錯誤 500.52 - URL Rewrite Module Error.
當 HTTP 回應的內容經過編碼 ("gzip") 時,無法套用輸出重寫規則。


原因是因為 GitLab 有開啟壓縮,但使用了反向 Proxy 無法將已壓縮的檔案進行修改,所以就噴了這個錯誤

  1. 解決方法是在 伺服器變數 做調整

  2. 新增兩個變數分別是 HTTP_ACCEPT_ENCODINGHTTP_X_ORIGINAL_ACCEPT_ENCODING

  3. 編輯輸入規則

  4. 新增兩個伺服器變數,伺服器變數名稱選擇剛剛加入的 HTTP_X_ORIGINAL_ACCEPT_ENCODING,值輸入 {HTTP_ACCEPT_ENCODING}

  5. 我們已經將 HTTP_ACCEPT_ENCODING 放到 HTTP_X_ORIGINAL_ACCEPT_ENCODING 裡面,原本的值就可以清空清空,但因為 UI 不允許輸入空值,所以這邊我就隨便打個值

    如果跟我一樣很在意的話可以去站台底下的 web.config 清空剛剛的值

  6. 終於可以開起來囉 ~

顯示調整

雖然已經可以正常開啟網頁了,但網址還是會顯示錯誤

  1. 新增兩個伺服器變數 HTTP_X_FORWARDED_HOSTHTTP_X_FORWARDED_PROTO
  2. HTTP_X_FORWARDED_HOST 輸入 Domain,HTTP_X_FORWARDED_PROTO 輸入 https
  3. 修改 /etc/gitlab/gitlab.rb 加上這段
external_url 'https://gitlab.exfast.me'
nginx['listen_port'] = 80
nginx['listen_https'] = false

 

這樣頁面顯示的網址就正常囉,不過 https://gitlab.exfast.me/profile/active_sessions 這邊顯示的 IP會是 IIS 那台的位址,所以還必須調整 /etc/gitlab/gitlab.rb 加上這段

# Each address is added to the the NGINX config as 'set_real_ip_from <address>;'
nginx['real_ip_trusted_addresses'] = [ '127.0.0.1', '192.168.56.106' ]
# other real_ip config options
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'

 

參考資料

  1. How to Configure IIS as a Reverse Proxy for Sonatype Products
  2. IIS with URL Rewrite as a reverse proxy – part 2 – dealing with 500.52 status codes
  3. 如何讓在 Reverse Proxy 之後的網站正常運行 (URL Rewrite)
  4. 如何利用 IIS7 的 ARR 模組實做 Reverse Proxy 機制
  5. Configuring GitLab trusted_proxies and the NGINX real_ip module
       

[Git] 常用指令總匯

分类 Git 命令 作用
配置 git config –global user.name “John Doe” 配置 Git 提交姓名
配置 git config –global user.email “[email protected] 配置 Git 提交邮箱
创建 git init 初始化当前目录为 Git 目录
创建 git add ./[file_name] 添加跟踪(所有)当前操作文件到 Git 管理暂存
创建 git clone [URL] 从 URL 仓库clone文件并建立 Git 管理
提交 git commit -m ‘提交记录’ 提交当前暂存区的文件并记录提交
提交 git status 查看文件 Git 状态
提交 git status -s/–short 查看文件 Git 状态(紧凑格式)
提交 .gitignore文件 文件中记录当前目录下不参与 git 跟踪的文件
比较 git diff 比较工作目录中当前文件和暂存区域快照之间的差异
比较 git diff –[cached/staged] 查看已暂存与当前已提交的文件差异
删除 git rm [file_name] 从当前 Git 仓库中删除某文件
删除 git rm -f [file_name] 从当前 Git 仓库中删除某文件(包括已修改但未暂存的文件
删除 git rm –cached [file_name] 从当前 Git 仓库中删除某文件不再跟踪(但保留在当前工作目录中)
移动 git mv [file_old_name] [file_new_name] 重命名/移动文件
日志 git log 查看提交日志
日志 git log -p -[N] 查看最近 [N] 次的提交日志和差异
日志 git log –stat 查看每次提交的简略的统计信息
日志 git log –graph 查看每次提交的图形化的统计信息
日志 git log –pretty=[oneline/short/full/fuller] 指定使用不同于默认格式的方式展示提交历史
日志 git log –pretty=format:”%h – %an, %ar : %s” 定制要显示的记录格式[^定制格式说明]
撤销 git commit –amend 撤销上次提交,并重新提交(用当前状态替换上次提交)
撤销 git reset HEAD [file] 取消某文件暂存(撤销某文件的 git add 操作)
撤销 git checkout – [file] 撤销对工作目录下未提交的文件的修改
远程 git remote [-v] 查看远端仓库名[及其 URL]
远程 git remote add [shortname] [url] 添加远端仓库并命名
远程 git fetch [remote-name] 拉取远端所有内容以及更新至本地引用
远程 git push [remote-name] [branch-name] 推送本地[branch-name]分支至远端[remote-name]
远程 git remote show [remote-name] 查看远端仓库详细状态
远程 git remote rename [remote-old-name] [remote-new-name] 重命名远端仓库
远程 git remote rm [remote-name] 移除远端仓库
标签 git tag 列出所有标签
标签 git tag -a [tag-name] -m “[annotation]” 创建附注标签
标签 git show [tag-name] 列出指定标签详细信息
标签 git tag [tag-name] 创建轻量标签
标签 git tag -a [tag-name] [commit-sha-1] 对某次提交(以 sha-1 码形式)补充标签
标签 git push [branch-name] [tag-name]/[–tags] 将本地的[某个/全部]标签全部推送至远端
标签 git checkout -b [branchname] [tagname] 在特定标签上创建一个新的分支
别名 git config –global alias.[alias] [command] 创建一个[command]的[alias]别名(git config --global alias.unstage 'reset HEAD --')
分支 git branch [branch-name] 创建分支(但是不会切换至此分支)
分支 git checkout [-b] [branch-name] [创建并]检出此分支为当前分支
分支 git merge [branch-name] 在当前分支处合并某分支
分支 git branch -[d/D] [branch-name] [删除/强制删除]某分支
分支 git branch [-v/-vv] 查看所有分支[以及它们最后一次提交/以及与本地缓存下的远端分支的联系]
分支 git branch –merged/–no-merged 查看[已经/尚未]合并到当前分支的分支
分支 git checkout -b [branch] [remotename]/[branch] 从远端检出并创建本地分支同时默认跟踪远端此分支
分支 git checkout –track [remotename]/[branch] 从远端检出并创建本地同名分支同时默认跟踪远端此分支
分支 git branch [-u/–set-upstream-to] [remotename]/[branch] 设置或更新当前分支跟踪远端分支
分支 git fetch –all 拉取远端分支所有更新至本地缓存
分支 git pull/[git fetch THEN git merge] 拉取远端分支并合并
分支 git push origin –delete [branch-name] 删除远端分支
变基 git rebase[目前使用不多,需要深入理解] 不要对在你的仓库外有副本的分支执行变基,详情参见此处
储藏 git stash/git stash save 储藏当前未提交的修改并回复工作目录至提交状态
储藏 git stash list 查看当前储藏栈
储藏 git stash apply [stash@{2}] 应用[最近的一次/指定的某次]储藏
储藏 git stash drop [stash@{0}] 在储藏栈中删除[指定的某次]储藏
储藏 git stash pop 在储藏栈中应用最近的一次储藏并删除
储藏 git stash –keep-index c储藏工作目录中未暂存的东西(已经通过 add 暂存的不储藏)
储藏 git stash -u 储藏当前未提交的修改(包括未加入 Git 跟踪的文件)
储藏 git stash branch [branch-name] 依据上次储藏的内容创建一个新的分支并应用上次的储藏(将上次储藏前的工作目录应用于一个新的分支上处理)
清理 git clean 清理当前目录中所有未被跟踪的文件且不能恢复(不包括 .gitignore 文件中的列表)
清理 git stash –all 清理当前目录中所有未被跟踪的文件并暂存起来
清理 git clean -f -d 移除工作目录中所有未追踪的文件以及空的子目录
清理 git clean -d -n 使用-n而不是-d表示做一次演习然后告诉你将要移除什么
清理 git clean -f -d -x 移除工作目录中所有未追踪的文件以及空的子目录(包括 .gitignore 文件中的列表)
清理 git clean -n -d -x 演习移除工作目录中所有未追踪的文件以及空的子目录(包括 .gitignore 文件中的列表)
重置 git reset[需要深入理解] 详情参见此处**
合并 git merge –abort 在 merge 操作后需要处理冲突时使用此命令撤销此合并
合并 git reset –hard HEAD 无论当前什么状态,直接恢复至本分支上次提交状态(这会将清除工作目录中的所有内容)
合并 git reset –hard HEAD~ 恢复至本分支上次提交的父状态(最近一次提交的父节点提交)
合并 git reset/revert 更多合并撤销详情见此处
  • 文件 .gitignore 的格式规范如下:
    • 所有空行或者以 # 开头的行都会被 Git 忽略。
    • 可以使用标准的 glob 模式匹配。
    • 匹配模式可以以(/)开头防止递归。
    • 匹配模式可以以(/)结尾指定目录。
    • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

    [^定制格式说明]: 格式详情见git log –pretty=format 常用的选项

來源:Git 常用命令总结

       

Git 指令 – 常用指令

補充

設定個人資訊

git config --global user.email "[email protected]"
git config --global user.name "sofast"

將推送的預設值更改為把「目前的」branch 推到它的 upstream

git config --global push.default simple

修改遠端來源

git remote set-url origin https://github.com/XXX(username)/YYYY(projectname).git

新建repository

本地目錄下,在命令列裡新建一個代碼倉庫(repository)
裡面只有一個README.md
命令如下:

touch README.md
git init

初始化repository

git add README.md

將README.md加入到緩存區

(可以用git add --a將所有改動提交到緩存(注意是兩個杠))

git commit -m "first commit"

提交改變,並且附上提交資訊”first commit”

Push

git remote add origin https://github.com/XXX(username)/YYYY(projectname).git

加上一個remote的位址,名叫origin,位址是github上的地址(Create a new repo就會有)
因為Git是分散式的,所以可以有多個remote.

git push -u origin master

將本地內容push到github上的那個位址上去。

參數-u
用了參數-u之後,以後就可以直接用不帶參數的git pull從之前push到的分支來pull。

此時如果origin的master分支上有一些本地沒有的提交,push會失敗.

所以解決的辦法是, 首先設定本地master的上游分支:

git branch --set-upstream-to=origin/master

然後pull:

git pull --rebase

最後再push:

git push

分支

新建好的代碼庫有且僅有一個主分支(master),它是自動建立的。
可以新建分支用於開發:

git branch develop master

新建一個叫develop的分支,基於master分支

切換到這個分支:

git checkout develop

現在可以在這個develop分支上做一些改動,並且提交。
注意:切換分支的時候可以發現,在Windows中的repository資料夾中的檔內容也會即時相應改變,變成當前分支的內容。

push方法1:

現在如果想直接Push這個develop分支上的內容到github

git push -u origin

如果是新建分支第一次push,會提示:
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin develop

輸入這行命令,然後輸入用戶名和密碼,就push成功了。

以後的push就只需要輸入

git push origin

push方法2:

比如新建了一個叫dev的分支,而github網站上還沒有,可以直接:

git push -u origin dev

這樣一個新分支就創建好了。

push方法3:

提交到github的分支有多個,提交時可以用這樣的格式:

git push -u origin local:remote

比如:

git push -u origin master:master

表明將本地的master分支(冒號前)push到github的master分支(冒號後)。
如果左邊不寫為空,將會刪除遠端的右邊分支。

創建分支的另一種方法

用命令

git checkout -b develop2 develop

可以新建一個分支develop2,同時切換到這個分支

刪除分支

可以查看所有的分支

git branch

將develop2分支刪除

git branch -d develop2

Clone

使用git clone+github位址的方法,專案預設只有master分支。git branch也只有master

要看所有的分支:

git branch -a

或者是

git branch -r

這時候要新建一個分支,叫做dev,基於遠端的dev分支:

git checkout -b dev origin/dev

加Tag

git tag tagname develop

git tag中的兩個參數,一個是標籤名稱,另一個是希望打標籤的點develop分支的末梢。

合併分支

git checkout master

先轉到主分支

git merge --no-ff develop

然後把develop分支merge過來

參數意義:
不用參數的預設情況下,是執行快進式合併。
使用參數–no-ff,會執行正常合併,在master分支上生成一個新節點。
merge的時候如果遇到衝突,就手動解決,然後重新add,commit即可。

轉載:在GitHub上管理项目