ReserveProxy 를 이용해서 gitlab을 운영하면, gitalb site 안에 있는 링크가 깨지는 경우가 있습니다. 이를 해결하기 위해서는 아래 파일에 dns domain 주소로 변경하면 됩니다.

아래와 같이 시스템이 구성이 되어 있는 상태입니다.

flowchart TD
apache(gitlab.xxxxxx.com) --proxy--> gitlab(10.2.2.2:8000)

설정

apache 설정

<VirtualHost *:443>
    ServerName gitlab.xxxxxxxx.com

    ProxyRequests Off       # Reserve Proxy Mode
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / https://192.168.20.100/ nocanon
    ProxyPassReverse / https://192.168.20.100/

    <Location />
        Order Deny,Allow
        Deny from all
        Allow from 162.21
    </Location>

    AllowEncodedSlashes NoDecode
    ErrorLog logs/gitlab_error_log
    TransferLog logs/gitlab_access_log
    LogLevel warn

    SSLEngine on
    SSLProxyEngine On

    SSLCertificateFile "/etc/pki/tls/certs/xxxxxxxxxx.com.crt"
    SSLCertificateKeyFile "/etc/pki/tls/private/xxxxxxxxxx.com.key"
    SSLCertificateChainFile "/etc/pki/tls/RootChain/chain_all_ssl.crt"
    SSLCACertificateFile "/etc/pki/tls/RootChain/chain_ssl.crt"


    CustomLog "/etc/httpd/logs/gitlab_" \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

도메인주소로 proxy 해서 사용해서 사용할 것이라 ProxyPass 부분을 https 로 설정해 주었습니다.
필수옵션:

  1. nocanon
  2. AllowEncodedSlashesgitlab.rb 설정
external_url 'https://gitlab.domain.net
puma['enable'] = true
puma['ha'] = false
puma['worker_timeout'] = 60
puma['worker_processes'] = 2
puma['min_threads'] = 1
puma['max_threads'] = 4
puma['listen'] = '127.0.0.1'
puma['port'] = 8001
puma['socket'] = '/var/opt/gitlab/gitlab-rails/sockets/gitlab.socket'
puma['somaxconn'] = 1024
puma['pidfile'] = '/opt/gitlab/var/puma/puma.pid'
puma['state_path'] = '/opt/gitlab/var/puma/puma.state'
puma['log_directory'] = "/var/log/gitlab/puma"
puma['exporter_enabled'] = false
puma['exporter_address'] = "127.0.0.1"
puma['exporter_port'] = 8083
letsencrypt['enable'] = false
  • external_url 에 domain 주소로 설정을 하면 letencrypt 기능이 자동으로 동작하는 것 같다. 그래서, 옵션으로 letsencrypt 부분을 false 처리 해 주었습니다.

Optional

위에 설정으로 gitlab 에 접속을 할 수 없을 경우에 아래와 같은 옵션을 사용할 수 있습니다.

1. /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml 에 있는 정보를 변경

nginx --> gitlab 으로 proxy로 연결해서 사용하게 되면, 링크가 깨지는 현상이 발생한다. 이를 해결하기 위해서 아래와 같은 설정으로 임시 해결할 수 있다. 단, 다른 기능이 또 안될 수 있다. (이 부분은 아직 해결을 못하고 있다.) 예를 들어 gitlab-runner 에 대한 설정을 하려고 들어가는 화면에서 링크가 깨진다.

production: base
  #
  # 1. GitLab app settings
  # ==========================

  ## GitLab settings
  gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    host: gitlab.xxxxxxxxxxxxx.com
    port: 443
    https: false

2. gitlab restart

gitlab-ctl restart
반응형

'개발' 카테고리의 다른 글

Mac이 AI PC로서 최고인 이유  (0) 2024.02.03
2024년 프로그래밍 랭킹  (1) 2024.01.02
elixir vs rust 비교  (1) 2023.12.27
vscode dev containers  (1) 2023.12.22
svn to git 마이그레이션 (맥)  (0) 2023.12.13

준비

아래와 같은 프로그램들이 설치 되어 있어야 합니다.

  • svn: svn소스
  • git: 깃
  • git-svn: 마이그레이션 도구

    MAC에서

$ brew install git git-svn svn

git에 remote repo를 생성해 놓습니다.

SVN 에서 사용자 가져오기

$ svn log -q
r38 | hello | 2016-04-29 15:44:52 +0900 (금, 29  4 2016)
------------------------------------------------------------------------
r37 | hello | 2016-04-29 15:00:44 +0900 (금, 29  4 2016)
------------------------------------------------------------------------

users.txt 사용자 매핑파일 생성하기

sample1 = sample1 <sample1@exmaple.com>
sample2 = sample2 <sample2@exmaple.com>
sample3 = sample3 <sample3@exmaple.com>
VisualSVN Server = VisualSVN Server <VisualSVN_Server@exmaple.com>

|> [!caution] 사소한 계정들 모두 정보가 있어야 합니다. 하나라도 빠지면 안됩니다.

Author: VisualSVN Server not defined in users.txt file 와 같은 에러가 발생합니다.

Migration

$ git-svn clone --authors-file users.txt --no-metadata --authors-file 'users.txt' https://123.223.12.22/svn/example/trunk
...
...
        M       src/main/java/com/exmaple/sample/see/weapojfawService.java
        M       src/main/java/com/exmaple/sample/service/real/HellowService.java
        M       src/main/java/com/exmaple/sample/util/excel/Excel.java
        M       src/main/java/com/exmaple/sample/util/excel/Excel2.java
        M       src/main/webapp/WEB-INF/views/fi/rt/netAssetsMonthly.html
r3029 = f317a56a69906edafdf641e2b9cc4388defb7f07587 (refs/remotes/git-svn)

위와 같은 식으로 된다

remote push

$ git remote add origin http://gitlab.com:port/remote_git.git
$ git push -u origin master
반응형

gitlab 을 구현한 시스템

메일 WEB 서버에서 Reserve Proxy Server를 통해서 자체 설치한 gitlab과 연결을 하고 있는 구조입니다.

flowchart BR
    A[apache web server] --Reserve Proxy--> B[gitlab server on-promise]

일반 apache 설정에서는 gitlab 에 요청을 하면 하위 URL에 제대로 요청을 할 수가 없습니다. 이를 해결하기 위해서 apache 에 reserve proxy 에 관한 설정을 해줘야 합니다.
저는 아래와 같이 80 port 로 들어온 요청을 443 으로 redirect 시켜서 서버 구성을 했습니다.

<VirtualHost *:80>
        ServerName      gitlab.domain.com
        Redirect        / https://gitlab.domain.com
</VirtualHost>
<VirtualHost *:443>
        ServerName      gitlab.domain.com

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://192.168.0.67:8000/
        ProxyPassReverse / http://192.168.0.67:8000/

        <Proxy *>
                Order allow
                Allow from all
        </Proxy>
        ....
</VirtualHost>

여기서 추가를 해 줘야 하는 옵션은 두가지 입니다.

  1. nocanon: ProxyPass 디렉티브와 함께 사용합니다.
    프록시 서버가 요청 URL을 정규화 하지 않도록 지정합니다. 정규화는 URL 경로를 표준화하여 중복된 슬래시를 제거하고 상위 디렉토리 참조를 해결하는 과정입니다. 원래 요청 URL의 경로를 그대로 유지할 수 있습니다.

  2. AllowEncodedSlashes NoDecode: ProxyPass 디렉티브와 함께 사용합니다.
    프록시 서버가 인코딩된 슬래시를 디코딩 하지 않도록 지정합니다. 기본적으로 Apache 는 인코딩된 슬래시를 디코딩하여 처리합니다. 인코딩된 슬래시를 그대로 유지할 수 있습니다. 일부 어플리케이션에서 인코딩 된 슬래시를 사용하는 경우 유용합니다.

<VirtualHost *:443>
        ServerName      gitlab.domain.com

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://192.168.0.67:8000/ nocanon
        ProxyPassReverse / http://192.168.0.67:8000/

        ....
        AllowEncodedSlashes NoDecode
</VirtualHost>
반응형

소프트웨어에 개발에서 실수를 했을 때, 간단히 돌아오는 방법이 있습니다. GIT을 사용해서 프로젝트를 관리한다면 실수에서 벗어나는데 큰 도움이 됩니다.

1. 추적 된 파일 추적 금지

빈번히 발생하는 일 중에 node_modules를 포함해서 commit 했고, .gitignore파일이 없다는 것을 발견 했습니다. 이제서야 .gitignorenode_modules를 추가 했지만, git은 여전히 node_modules 을 추적하고 있습니다.
git base에 commit이 되면서 git이 계속변경 사항을 추적하기 때문입니다. 이를 중지하기 위해서는 아래와 같이 입력 합니다.

git base 에 있는 파일이 삭제 됩니다.

git rm -r --cached node_modules

2. 마지막 commit 수정

local -> git remote 로 commit을 했습니다. 그 후 커밋 파일에 변경 사항을 포함하는 것을 잊었습니다. 또는 가장 최근 커밋한 동일한 커밋에 연결하려는 새 파일을 추가합니다.

git은 이전 커밋을 잠금 해제하고 새 파일을 추가 할 수 있습니다.

git add newfile
git commit --amend -no-edit

--no-edit: commit 메세지를 변경하지 않고, comiit을 수정합니다.

3. 마지막 commit 메세지 수정

위의 수정내용과 비슷합니다. git에 commit을 했는데, commit 한 메세지가 원하는 내용과 달라졌습니다.

git commit --amend -m '메세지가 #2 로 바뀜'

4. 작업 폴더내의 작업내역 삭제

프로젝트를 진행하고 있습니다. 코드를 수정하는 동안 프로그램이 손상되었고, 실제로 무엇이 잘못 되었는지 파악할 수 없게 되었습니다.
현재 작업내용을 취소하고 마지막 commit 시점으로 돌아가야 할 것 같습니다.

git restore .

또는

git reset --hard

이 작업 local 저장소에서 최근 커밋으로 복원 합니다. 커밋하지 않는 내용은 모두 손실 됩니다.

5. 특정파일에 대한 작업 내용 취소

local 저장소의 파일을 수정했습니다. 히지만, test.js 파일의 변경 사항이 의미가 없었다는 것을 알고, 폐기하려고 합니다.

git restore test.js

6. 시간을 거슬러 이전 버전으로 파일 복원

위의 명령어와 달리 파일을 이전 특정 시점 상태로 돌아가기를 원합니다. test.js 파일을 최근 commit 된 내용이 v10 이지만, v2 시점으로 돌아가려고 합니다.

git log


commit d94629103526ddfa0715ca9393362a3b70e097b
Merge: aa034a93 1809aa89
Date:   Tue Aug 9 07:40:00 2022 +0900

    Merge pull request #15 from aaaaaday/master

commit 1809aklflkajlkhfeff890913ec751b36167560
Date:   Sun Aug 7 16:26:45 2022 +0100

    리뷰에 따라 수정 완료

commit 1b93eehwkhflwkehf280b513806b000dd033b9f
Date:   Sat Aug 6 00:58:16 2022 +0100

    원문과 최대한 라인수 일치하도록 수정

를 통해 복원하려고 하는 시점의 commit hash 를 찾습니다.

git restore --source <commit-hash> <파일이름>

7. 삭제한 파일 복원 (이전 commit)

프로젝트를 새로 변경하고 있는데 사용되지 않는 파일이 표시됩니다. 계속해서 파일을 삭제 했습니다.
그러나, 삭제한 파일 deleted_file.js가 필요하다는 것을 알게 되었습니다.

git restore deleted_file.js

8. local 저장소의 모든 변경사항을 remote 상태로 취소합니다.

local repo 브런치에세 몇가지 변경 사항과 commit을 했습니다. 그런데, 변경 사항을 모두 pull을 받았을 당시로 되돌리려고 합니다.

git reset --hard origin/master

commit 되지않는 파일은 영구적으로 삭제 됩니다.

9. 추적되지 않는 파일 삭제 (untracked file)

프로젝트에 여러 개의 새 파일을 만들고 일부 파일도 수정했습니다. 접근 방식을 변경했으며 이제 생성한 새 파일이 더 이상 필요하지 않지만, 수정된 파일 변경 사항을 유지하기로 결정했습니다.
Git은 추적되지 않은 파일을 제거하는 명령을 제공합니다.

git clean -f

git clean 명령에는 force 지시문(또한 --force)을 의미하는 -f 플래그가 필요합니다.

이 작업에는 추적되지 않은 파일 삭제가 됩니다. Git에서 커밋되지 않은 작업을 제거하는 것은 취소할 수 없습니다.

기본적으로 이 명령은 .gitignore로 지정된 추적되지 않은 폴더나 파일을 제거하지 않습니다. 무시된 파일을 제거하려면 -x 옵션을 지정하십시오. 또한 git clean은 디렉토리에서 재귀적으로 작동하지 않습니다.
이것은 우발적인 영구 삭제를 방지하기 위한 또 다른 안전 메커니즘입니다. 디렉토리를 제거하려면 다음과 같이 -d 플래그를 사용하십시오.

자식 청소 -df 이렇게 하면 추적되지 않은 파일과 디렉토리가 지워지지만 .gitignore 파일에 나열된 파일과 디렉토리는 제거되지 않습니다.

10. commit 을 다른 branch로 전환

프로젝트가 발전했으며 현재 newsletter 추가와 layout 미세 조정이라는 두 가지 기능을 작업하고 있습니다. newletterlayout이라는 두 개의 별도 분기를 만들었으며 각 분기를 관련 기능인 뉴스레터 및 레이아웃 전용으로 지정했습니다.

현재 뉴스레터 기능을 추가하고 있으며 뉴스레터 분기에서 몇 가지 커밋을 수행하고 있습니다. 다음에 프로젝트로 돌아올 때 레이아웃 기능에 대해 작업하려고 하는데 연결된 레이아웃 분기로 전환하는 것을 잊었습니다. 잘못된 뉴스레터 분기에서 레이아웃 기능을 추가하고 커밋했습니다.

나중에 뉴스레터 분기에 추가한 커밋이 실제로 레이아웃 분기에 속한다는 사실을 알게 됩니다.

따라서 커밋 추가 레이아웃 기능이 뉴스레터 분기에서 올바른 레이아웃 분기로 이동되기를 원합니다.

Git에서 수행할 작업은 다음과 같습니다.

newleter 지점으로 checkout

git checkout newletter

레이아웃 기능을 추가한 커밋의 커밋 해시를 찾아 복사합니다. 다음 명령을 실행합니다.

git log
# aceew89e0ac

이 커밋으로 적용하려는 올바른 브랜치를 확인하십시오. 우리의 경우:

git checkout layout

# 확인한 hash을 layout branch에 적용
git cherry-pick <commit-hash> 

그런 다음 뉴스레터 분기를 확인합니다.

git checkout newletter
# 잘못 commit 한 내용을 삭제 합니다.
git reset HEAD~1 --hard
or
git reset HEAD^ --hard

HEAD~1은 뉴스레터 브랜치를 재설정하여, 가장 최근 커밋 뒤로 하나의 커밋을 옮기고 다른 곳으로 이동한 커밋을 제거한다는 의미입니다. 우리의 경우 이 newletter 분기에 대한 최신 커밋은 layout 기능이 있는 커밋이었습니다.

11. 삭제된 branch 부활시키기

더 이상 기능 브랜치가 필요하지 않다고 생각하고 삭제했습니다. 다음번에는 삭제가 실수였다는 사실을 알 수 있습니다. 이 황당한 사건에 대해서 당황해 합니다. 당신은 불가능하게 시간을 되돌려 그것을 되찾고 싶어합니다.
삭제된 브랜치를 되돌리고 싶어합니다.

삭제된 브랜치를 복구하는 방법은 다음과 같습니다.

명령을 실행할 때 나열될 삭제된 분기의 커밋 해시를 찾아 복사합니다.

git reflog

그런 다음 다음과 같이 분기를 다시 만듭니다.

git branch <new-branch-name> <삭제된 브런치 hash>

이것은 <deleted-branch-commit-hash>까지의 모든 작업을 포함할 분기를 다시 생성합니다. <deleted-branch-commit-hash>가 삭제된 분기의 최신 작업이 아닌 경우, 최신 작업이 있는 커밋을 얻을 때까지 새 커밋 해시를 찾을 수 있습니다.
git branch를 입력하면 이전에 삭제한 브랜치가 다시 나열되는 것을 볼 수 있습니다. 이것은 Origin(remote)에서 브랜치가 삭제된 경우에도 작동합니다.

<branch-name>이 원하는 이름이 아닌 경우 git branch -m <branch-name> <new-branch-name>으로 이름을 바꾸면 됩니다.

삭제된 브랜치를 성공적으로 되돌리는 열쇠는 올바른 커밋 해시를 찾는 것입니다. 커밋의 이름을 똑똑하게적 지정하십시오. 그것은 많은 도움이됩니다.

12. 잘못된 commit 되돌리기

팀에서 새 버전의 프로젝트를 출시했습니다. 추가된 모든 새로운 기능이 절대적인 마스터 클래스임을 모두 확신합니다. 잠시 후 팀 리더의 긴급 전화로 새 버전에 중요한 결함이 있으며 즉시 수정해야 한다는 연락이 왔습니다. 엔지니어링 팀은 긴급 조치를 취해야 하며, 앉아서 결함을 찾는 것은 긴급한 문제에 대한 적절한 대응이 아닙니다.

가장 빠른 응답 중 하나는 오류가 발생하기 쉬운 릴리스에 대한 변경 사항을 취소하는 것입니다. 따라서 커밋에 대한 변경 사항을 취소하고 싶습니다.

Git에서 진행하는 방법은 다음과 같습니다.

변경 사항을 취소하려는 커밋(깨진 커밋)의 커밋 해시를 찾아 복사합니다.

git log
# 해당 커밋에 지정된 변경 사항 되돌리기
git revert <잘못 된 commit-hash>

git revert는 되돌린 변경 사항으로 새 커밋을 만듭니다.

깨진 커밋에 지정된 모든 변경 사항은 새 커밋에서 롤백됩니다. 예를 들어, 깨진 커밋에서 제거된 모든 것이 새 커밋에 추가되고, 깨진 커밋에서 추가된 모든 것이 새 커밋에서 제거됩니다.
생성될 커밋 되돌리기에 대한 기본 커밋 메시지와 함께 기본 편집기가 팝업됩니다. 원하는 대로 수정할 수 있습니다.

13. merge(병합) 취소

기능 분기의 새로운 변경 사항에 만족합니다. 기능 브랜치를 메인 브랜치에 병합할 준비가 된 것 같습니다. 따라서 기본 분기에서 기능 분기를 병합하고, 새 변경 사항을 원격 저장소에 푸시합니다.

잠시 후, 병합이 실제로는 그다지 좋은 코드가 아니라는 것을 알게 되었습니다. 그래서 병합을 취소하고 싶습니다.

# master branch로 이동합니다
git checkout master
# 병합 commit의 hash를 확인합니다
git log
# 되돌리기
git revert -m 1 <merge-commit-hash>

병합의 분기는 해당 병합의 부모입니다.

일반적으로 git은 병합의 어느 쪽(부모)이 메인라인으로 간주되어야 하는지 모르기 때문에 병합을 되돌릴 수 없습니다. git revert -m 1 메인라인의 상위 번호를 지정하고 지정된 상위 항목에 상대적인 변경 사항을 되돌리기 위해 revert를 허용합니다.

일반적으로 git merge 중에 가장 먼저 기록되는 부모는 병합할 때 있던 분기입니다. 여기서 오류의 경우 메인 브랜치에서 체크아웃하는 동안 feature 브랜치를 병합했습니다. 따라서 -m 1은 주 분기를 지정합니다.

14. 이전 버전으로 롤백

프로젝트를 이전 버전으로 롤백할 수 있습니다. 이렇게 하면 최근에 깨진 커밋 이전에 올바르게 작동하던 버전으로 돌아가려고 합니다.

여기에 표시된 git 명령은 기록을 다시 씁니다. 다른 사람과 소프트웨어 프로젝트를 공동 작업할 때는 적합하지 않습니다. 부득이 작업을 하게 된다면 다른 사람들에게 해당 내용을 공유하여야 합니다.

따라서 리포지토리의 기록을 되감아 프로젝트의 이전 버전으로 이동하려고 합니다.

git reset --hard <commit-hash>

git reset은 HEAD 포인터(따라서 작업 트리)를 이전 버전(<commit-hash>)으로 이동합니다.
이 버전 이후의 커밋은 프로젝트 기록에서 제거됩니다.

--hard 플래그는 스테이징 영역과 작업 트리를 재설정합니다.

git reset --mixed <commit-hash>와 같은 --mixed 플래그를 사용하면 저장소를 작업 트리의 지정된 커밋 해시 보존 파일로 다시 재설정합니다. 이후 커밋에 있었지만 재설정한 커밋에는 없는 파일은 추적되지 않는 파일이 됩니다.

--mixed 플래그는 인덱스(스테이징 영역)를 처리하는 방식에 차이가 있지만 --soft와 가까운 사촌이 있습니다.

--mixed 플래그는 스테이징 영역(색인)을 재설정하지만 작업 트리는 재설정하지 않습니다. 따라서 다음 커밋에서 추적되지 않은 파일을 추가하려면 git add 다음 git commit해야 합니다.

--soft 플래그는 스테이징 영역이나 작업 트리를 재설정하지 않습니다. 따라서 다음 커밋에서 추적되지 않은 파일을 추가하려면 git commit만 하면 됩니다.

15. 이전 커밋 메시지 수정

프로젝트 진행에 만족합니다. 프로젝트 기록을 살펴보고 있습니다. 하지만, 모호한 커밋 메시지를 발견했습니다. 따라서 이 메시지를 논리적 의미를 설명하는 더 나은 메시지(더 나은 설명이 있는 메시지)로 변경하려고 합니다.

Git에서 대화형(interactive) rebase를 사용하여 기록에서 더 깊은 커밋 메시지를 편집할 수 있습니다. 커밋 메시지를 변경하려는 커밋의 커밋 해시를 찾아 복사합니다.

rebase 대화형 세션을 엽니다.

git rebase -i <commit-hash>

편집기가 나타납니다.

위의 샘플 대화형 rebase 세션에서 1행에 오타가 있음을 알 수 있습니다. 이 오타를 수정하고 더 나은 설명 메시지를 제공하겠습니다.

편집기에서 수행하려는 작업만 지정합니다. 지금 당장 커밋 메시지를 다시 작성하고 싶을 수 있지만, 그렇게 하지는 않습니다. rebase -i는 SHA(커밋 해시) 열 이후의 모든 것을 무시합니다. 그 뒤의 텍스트는 커밋 해시가 무엇인지 기억하는 데 도움이 됩니다.

커밋의 내용을 유지하지만 커밋 메시지를 편집하려면 메시지를 변경하려는 커밋에 대해 reword action 명령을 지정하십시오. 다음과 같이 첫 번째 열의 단어 선택을 단어 reword(또는 r만)로 바꾸면 됩니다.

 (1 year, 7 months ago) Auto Deploy (Merge pull request #3 from node/translation/ch03 - github-actions[bot]
noop

# Rebase 53723b64..53723b64 onto 53723b64 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
#         create a merge commit using the original merge commit's
#         message (or the oneline, if no original merge commit was
#         specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#

Reword 리베이스 작업

그런 다음 편집기를 저장하고 닫습니다.

마지막으로 git은 커밋 메시지를 변경할 수 있는 편집기를 엽니다. 커밋 메시지를 더 나은 것으로 변경하십시오.

이전 커밋 메시지 업데이트

마지막으로 편집기를 저장하고 닫을 수 있습니다. 커밋은 새 커밋 메시지로 업데이트됩니다.

16. 오래된 커밋 삭제

오래된 커밋이 당신을 귀찮게 할 수 있으며 프로젝트 기록에서 삭제되기를 원할 수 있습니다. 따라서 이 커밋이 더 이상 프로젝트 기록에 나타나지 않기를 원합니다.

다음과 같이 이 커밋을 삭제할 수 있습니다.

먼저, 예정된 커밋의 커밋 해시를 찾아 복사합니다.

git log

git rebase -i <commit-hash>

커밋을 삭제하기 위한 drop 액션 단어를 지정합니다:

pick f39873d 안녕
pick c33dih3 방가워
drop 24dddvw 삭제하고 싶은 commit
pick dpojafe 하하하

편집기를 저장하고 닫습니다. 예정된 커밋은 프로젝트 기록에서 제거됩니다.

17. 이전 커밋에 새로운 변경사항 수정

프로젝트에 변경 사항을 추가하려는 상황이 발생할 수 있습니다. 그러나 이 변경 사항은 특정 변경 사항을 처리하던 당시의 커밋과 관련이 있습니다.

예를 들어, 프로젝트는 여러 커밋으로 발전했으며 아마도 가장 최근 커밋을 프로젝트의 v5로 브랜드화할 수 있습니다. file.js을 만들었습니다. 당신은 이 파일이 아마도 프로젝트 v2에서 더 깊은 기록의 이전 커밋의 일부가 되기를 원합니다.

Git에서는 새로운 변경 사항을 커밋에 다시 결합하여 이전 커밋을 편집할 수 있습니다.

단계는 다음과 같습니다.

편집용으로 표시하려는 커밋의 커밋 해시를 찾아 복사합니다.

git log

#rebase interactive
git rebase -i "<commit-hash>^"

<commit-hash> 끝에 캐럿(^)을 추가하는 방법에 유의하십시오. 이렇게 하면 이 표시된 커밋을 편집한 후 커밋의 원래 연대기로 돌아가고 싶다고 Git에 알릴 수 있습니다. git rebase -i "<commit-hash>^"를 실행하면 git log에 표시된 <commit-hash>가 가장 최근 커밋으로 표시되기 때문입니다.

이 명령을 실행하면 기본 편집기가 나타나고, <commit-hash>를 언급하는 줄에서 편집할 작업 동사 선택을 수정합니다.

작업 트리와 프로젝트 기록은 이제 이전에 커밋했을 때의 상태입니다. git log를 실행하면 <commit-hash>가 가장 최근 커밋임을 알 수 있습니다. 작업 트리에 생성한 파일(file.js)이 여전히 있으며 가장 최근 커밋으로 수정할 수 있는 좋은 기회입니다. 이 시점에서 가장 최근 커밋이 편집하려는 커밋임을 기억하십시오.

따라서 다음과 같이 수정하십시오.

git add file.js
git commit --amend --no-edit
# 기록을 정상순서로 되돌리기
git rebase --contirnue

이런 식으로 file.js을 추가하여 <commit-hash>에 지정된 커밋을 편집했습니다.

경고: 이렇게 하면 해당 시점부터 기록이 다시 작성됩니다. 팀 환경에서 프로젝트를 작업할 때는 좋은 생각이 아닙니다.

팀프로젝트에서는 기록을 다시 쓰는 것은 지양해야 합니다. 많은 소스 꼬임이 발생할 수 있습니다.

반응형

2년동안 gitlab을 운영하면서 한번도 업그레이드를 하지 않았습니다. gitlab.com 사이트에서는 계속 신기술과 최적화가 이뤄지도 있었지만, 온프로미스에 설치되어 있는 사내 gitlab은 새로운 시대에 적응을 못하고 있었습니다. 그래서, 이번에 버전업을 진행하면서 작업 방법에 대해서 글을 남깁니다.

gitlab 은 업그레이드 주요버전을 넘어서 업그레이드 할 수 없습니다. 설치하려고해도 설치완료 되었다는 메세지를 확인할 수 없습니다. 아래와 같은 메세지 Complete!라는 메세지와 로고가 나와야 합니다.

gitlab Reconfigured!
Restarting previously running GitLab services
ok: run: alertmanager: (pid 29637) 0s
ok: run: gitaly: (pid 9202) 7121s
ok: run: gitlab-exporter: (pid 29649) 0s
ok: run: gitlab-kas: (pid 29612) 1s
ok: run: gitlab-workhorse: (pid 29623) 1s
ok: run: grafana: (pid 29653) 1s
ok: run: logrotate: (pid 29663) 0s
ok: run: nginx: (pid 29672) 1s
ok: run: node-exporter: (pid 29683) 0s
ok: run: postgres-exporter: (pid 29689) 1s
ok: run: postgresql: (pid 1562) 9127s
ok: run: prometheus: (pid 29707) 0s
ok: run: puma: (pid 29794) 0s
ok: run: redis: (pid 8759) 7201s
ok: run: redis-exporter: (pid 29800) 1s
ok: run: sidekiq: (pid 29807) 0s

     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/


Upgrade complete! If your GitLab server is misbehaving try running
  sudo gitlab-ctl restart
before anything else.
The automatic database backup was skipped as requested.
You may enable it again anytime by running the following command:
  sudo rm /etc/gitlab/skip-auto-backup

  Verifying  : gitlab-ce-14.10.4-ce.0.el7.x86_64                                                                                                      1/2
  Verifying  : gitlab-ce-14.9.5-ce.0.el7.x86_64                                                                                                       2/2

Updated:
  gitlab-ce.x86_64 0:14.10.4-ce.0.el7

Complete!

1. 준비

1.1. 백업

원복하기 위한 작업입니다. 2년 넘게 작업해온 내역들이 날아갈 수 있습니다. 내용을 작성하면서 다시 한번 백업을 진행했습니다. 백업은 자주 해 주시면 좋습니다. 기왕이면 crontab을 사용해서 작성하시기 바랍니다.

$ gitlab-backup create
2022-07-05 23:04:05 +0900 -- Dumping repositories ... done
2022-07-05 23:04:05 +0900 -- Dumping uploads ...
2022-07-05 23:04:06 +0900 -- Dumping uploads ... done
2022-07-05 23:04:06 +0900 -- Dumping builds ...
2022-07-05 23:04:06 +0900 -- Dumping builds ... done
2022-07-05 23:04:06 +0900 -- Dumping artifacts ...
2022-07-05 23:04:06 +0900 -- Dumping artifacts ... done
2022-07-05 23:04:06 +0900 -- Dumping pages ...
2022-07-05 23:04:06 +0900 -- Dumping pages ... done
2022-07-05 23:04:06 +0900 -- Dumping lfs objects ...
2022-07-05 23:04:06 +0900 -- Dumping lfs objects ... done
2022-07-05 23:04:06 +0900 -- Dumping terraform states ...
2022-07-05 23:04:06 +0900 -- Dumping terraform states ... done
2022-07-05 23:04:06 +0900 -- Dumping container registry images ... [DISABLED]
2022-07-05 23:04:06 +0900 -- Dumping packages ...
2022-07-05 23:04:06 +0900 -- Dumping packages ... done
2022-07-05 23:04:06 +0900 -- Creating backup archive: 1657029839_2022_07_05_14.10.4_gitlab_backup.tar ...
2022-07-05 23:04:06 +0900 -- Creating backup archive: 1657029839_2022_07_05_14.10.4_gitlab_backup.tar ... done
2022-07-05 23:04:06 +0900 -- Uploading backup archive to remote storage  ... [SKIPPED]
2022-07-05 23:04:06 +0900 -- Deleting tar staging files ...
2022-07-05 23:04:06 +0900 -- Cleaning up /var/opt/gitlab/backups/backup_information.yml
2022-07-05 23:04:06 +0900 -- Cleaning up /var/opt/gitlab/backups/db
2022-07-05 23:04:06 +0900 -- Cleaning up /var/opt/gitlab/backups/repositories
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/uploads.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/builds.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/artifacts.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/pages.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/lfs.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/terraform_state.tar.gz
2022-07-05 23:04:07 +0900 -- Cleaning up /var/opt/gitlab/backups/packages.tar.gz
2022-07-05 23:04:07 +0900 -- Deleting tar staging files ... done
2022-07-05 23:04:07 +0900 -- Deleting old backups ... [SKIPPED]
2022-07-05 23:04:07 +0900 -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.

/var/opt/gitlab/backups 에 백업한 파일들이 있는 것을 확인할 수 있습니다.

1.2. DB 자동 백업 중지

gitlab은 버전업을 하면 DB 또한 버전에 맞춰서 갱신되는 작업을 합니다. 이 부분을 자동으로 갱신되는 것을 방지 합니다. /etc/gitlab폴더에 파일을 생성해 놓으면 gitlab에서 자동으로 백업되는 것을 방지할 수 있습니다.

$ touch /etc/gitlab/skip-auto-backup

2. 업그레이드 작업

2.1. 업그레이드 순서 확인

8.11.Z -> 8.12.0 -> 8.17.7 -> 9.5.10 -> 10.8.7 -> 11.11.8 -> 12.0.12 -> 12.1.17 -> 12.10.14 -> 13.0.14 -> 13.1.11 -> 13.8.8 -> 13.12.15 -> 14.0.12 -> 14.3.6 -> 14.9.5 -> 14.10.Z -> 15.0.Z -> latest 15.Y.Z

여기에 업그레이드 버전에 맞춰서 단계별로 진행해야 합니다. 현재 버전이 중간에 있다면, 그 다음 버전으로 업그레이드 해주면 됩니다.

주의: 한번씩 업그레이드 해 줄때마다 백그라운드 이전작업이 진행 됩니다. 이 부분을 반드시 확인하면서 진행하여야 합니다.
또한 redis 버전, progres 버전 등을 업그레이드 해줘야 하는 경우도 있습니다.

$ yum install gitlab-ce-13.8.8
$ yum install gitlab-ce-13.12.15
$ yum install gitlab-ce-14.0.12

2.2. 업그레이드 전에 백그라운드 업데이트 체크

업그레이드 후에 백그라운드에서 DB 데이터등을 업데이트 하는 작업이 있는지 확인하면서 진행합니다. 작업이 다 끝나지 않았는데 업그레이드를 진행하면 데이터가 깨질 수 있다고 합니다.

2.2.1. bash 명령어로 확인

# 작업 확인
$ sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
0 # 작업중이면 '1'로 표기

2.2.2. 관리자 화면에서 확인

gitlab을 admin계정으로 접속을 한 후,
[Admin Area] - [Monitoring] - [Background Migrations] 에 들어가면 상단 Queue에 현재 작업 또는 대기중인 내역을 확인할 수 있다.

반응형

git를 처음 사용하면 설정에 대해서 조금 알아야 할 필요가 있다. 어떻게 보면 최초에 해 놓고 신경을 안 쓰면 되긴 하지만, 이 부분을 잘 해 놓고 가지 않는다면 다시 문제가 생기게 된다.

git 문서를 읽어보면 설정하기에 대한 문서가 잘 나와있다.여기

git config명령어를 통해서 설정을 확인하고 변경할 수 있다.

  • /etc/gitconfig 파일: 시스템의 모든 사용자와 모든 저장소에 적용되는 설정이다. git config –system 옵션으로 이 파일을 읽고 쓸 수 있다.
  • ~/.gitconfig, ~/.config/git/config 파일: 특정 사용자에게만 적용되는 설정이다. git config --global 옵션으로 이 파일을 읽고 쓸 수 있다.
  • $ git config --global -e 사용자 설정을 editor 를 통해서 변경할 수 있다.
  • .git/config: 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다.

사용자 설정하기

설치하고 난 후에 할 일은 사용자 정보를 설정하는 일이다.

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

이렇게 설정하고 나면 git 서버에 Push를 할 때마다 이 정보로 log를 남긴다.

편집기 설정하기

$ git config --global core.editor emacs

-e 옵션을 통해서 사용할 편집기를 설정할 수 있다. 예를 들어서 –global 설정을 변경하고자 할 때,

$ git config --global -e

와 같은 명령어를 통해서 간단히 설정을 변경할 수 있다.

설정 확인하기

$ git config -l

git의 시스템 설정과 저장소의 정보를 불러온다. 그렇기 때문에 중복 된 값을 볼 수도 있으니 당황하지 말자.

반응형

라즈베리파이를 활용하면서 이것저것 재매난 것들을 만들어 보고 싶다.
예전에 라즈베리파이에 git 저장소를 만들었는데, 다시 하려니까 기억이 안나더라. 나이가 들어서 그런 것 같아 이번에 다시 한번 해결하는 방법을 기록해 두도록 하자.

서버에서 해야하는 일

파일들이 저장되는 장소를 만든다.
.ssh 파일을 받아와서 .ssh/authorized_keys 에 추가한다.

git clone – [폴더명] [폴더명].git
이라는 명령어를 사용해야 하지만, 나는 안 되길래 아래와 같은 명령어를 사용했음

/home/pi 에서 아래와 같은 명령어 실행하기

# git init --bare [폴더명].git
    Initialized empty Git repository in /home/pi .ssh/works.git/

폴더가 생성 된 것을 확인할 수 있다.

사용자

ssh-keygen 으로 키 생성하기
ssh 파일을 서버로 보내주기

scp 명령어를 사용해서 간단하게 보낼 수 있다.
본인은 11022 를 ssh 포트로 사용하고 있기 때문에 아래와 같은 -P 옵션을 사용했다.
복사되는 디렉토리 뒤의 / 까지 적는 것을 잊지말자. 이 문제 때문에 한참을 찾아 해맸다.

scp -P 11022 [원본파일명] pi@address:/home/pi/

서버

다시 서버로 돌아와서 보내온 ssh 파일을 등록해서 접속을 허가해 준다

cat [파일명].pub >> ~/.ssh/authorized_keys

라고 입력

사용자가 해야 하는일

이제 사용자가 접속할 수 있는 권한을 얻었다. 이제 remote 저장소로 등록을 하고 난 뒤에 Push 할 수 있다. 프로젝트마다 적어도 한명은 –bare 옵션을 사용해서 Bare 저장소를 만들어야 한다고 하는데, 나는 이게 뭔 소리인지 잘 이해할 수 없었다. 혹시 아시는 분이 좀 알려줬으면 좋겠다.

cd project
git init
echo ‘hello git’ > README
git add .
git commit -m ‘hello’
git remote add origin ssh://git@[서버]:11022/home/git/project.git
git push origin master

이와 같은 명령을 하고 난 뒤에 비밀번호를 입력하고 파일을 자유롭게 올릴 수 있을 것이다.

사용자 2

이제 다른 사용자가 이를 clone 해서 수정하고 Push 할 수 있다.

git clone ssh://git@[서버]:11022/home/git/project.git
cd project
cat README
git commit -am ‘fix’
git push origin master

수고 하셨습니다.

반응형

+ Recent posts