Skip to main content

6 posts tagged with "git"

View All Tags

· 3 min read

Git을 사용하면서 여러명의 사용자가 하나의 저장소에 push를 할 때 종종 오류와 함께 push가 안되는 상황이 발생한다.

(fatal: failed to write object 와 같은 오류가 발생하는 경우임)

원인은 push할 원격 저장소(.git)의 objects에 파일을 써야 하는데 권한이 없기 때문인데

이미 objects를 A라는 사람의 이름으로 생성을 했는데 B라는 사용자가 같은 파일에 대한 쓰기를 시도(A가 이전에 만든 파일을 수정해서 push)하게 되고

이 때 objects의 파일들이 group이나 others에 대한 쓰기 권한이 없는 상태인 경우이다.

Linux에서 umask를 적절히 변경해서 사용하고 있고 사용자에 대한 기본그룹이 사용자 계정이 아닌 공통으로 사용하는 그룹으로 지정되어 있다면 문제가 없다.

이와 관련한 git의 config가 있는데 바로 core.sharedRepository이다. (참조 : http://git-scm.com/docs/git-config)

옵션에 대한 값은 group (true), all (world, everybody), umask (false) 까지 제공되는데 group이나 true로 했을 경우 저장소 내에 파일 생성시 그룹 쓰기 권한을 세팅하게 되고, all은 모든 사용자가 읽기 가능 + 그룹쓰기 권한, umask나 false로 설정시 umask 값에 따라서 권한 설정을 하게 된다. Default는 umask (false).

 

이 옵션을 설정하지 않았다 하더라도 umask와 기본 그룹 설정만 하면 되니 별 문제가 없는게 일반적인데 가끔 신규 서버 구축시 기본그룹 설정을 잊어버렸다면 써먹을만 하다.

git 자체가 사용자 관리에 대한 제대로 된 기능이 없다보니 그래도 가장 좋은 방법은 사용자 관리가 손쉬운 다른 tool을 함께 사용하는 방법이라고 본다.

· 6 min read

GIT 설정을 따로 할 일이 별로 없었는데 repo까지 사용하는 환경에서 자동화 하다보니 필요해졌고, 공식 페이지가 진리라 따로 부연할 꺼리도 없지만 이번에 사용해 본 설정만이라도 정리해보기로 했다. 최소한 이런 설정을 어떤 경우에 사용할 수 있는지라도 설명이 될 수 있을 것 같다.

1. 상황

언급했듯이 repo를 사용하는 환경이다. repo에 대해서 간단히 설명하자면, 여러개의 GIT 저장소를 가지고 빌드를 하거나 개발을 할 때 편의를 제공하기 위해 Google에서 만든 툴로 AOSP (Android Open Source Project)에서 사용되고 있다. Python으로 개발된 script의 모음이고 manifest 내부를 보면 어느 저장소를 어느 경로에 갖다 두는지에 대한 내용들이 주를 이루고 있다.

repo 이외에 Gerrit도 사용하고 있다. Gerrit은 역시 AOSP에서 사용되는 Code Review 툴로 code review 이외에 다른 기능을 위해 사용하는 것도 가능하다. (예를 들면 코드 검증, review 만을 위해서가 아니고)

저장소를 Gerrit에 연결하기 위해서는 Gerrit project로 등록을 해야 하는데, 등록이 되면 저장소 별로 따로 사용자 인증에 필요한 절차를 수행할 필요 없이 Gerrit에서 관리가 가능해진다.

이 부분도 Gerrit의 장점이라고 할 수 있다. GIT을 쓰면서 제일 불편한 것중 하나가 사용자 인증과 관리니까. 또 그래서 여러가지 툴들도 꽤 등장했다. Gitblit, Gitlab, 등등. 서비스에서도 그런 기능을 제공하기도 한다. 많이 쓰고 있는 github이 그 예가 될 것이고.

Gerrit 설정이 갑자기 바뀌면서 repo init을 할 때 command 형태를 변경해야만 했는데 (계정과 gerrit의 port를 추가해야 했다. 일반적으로 별도 설정없이 Gerrit을 그대로 쓰면 계정과 port 정보를 꼭 넣어줘야 하는데 이곳 환경에서는 최초에 없어도 되었었지만, 추가해야 하는 형태로 다시 변경되었음), 문제는 init을 하더라도 manifest 파일에는 계정과 port 정보가 빠져있는 형태의 대표 url만 기록되는 곳에서 발생했다. repo sync 이전에 manifest 파일을 열어서 fetch url 부분을 수정해야만 했다.

2. 조치

원래 나와 같은 위치에 있는 사람들에겐, 대다수가 권한과 정보에 대해서 상당히 인색한 편이다. 아쉬울게 없다. 나만의 해결책을 만들어서 보고하고 마음에 들지 않으면 이슈로 제기하면 되니까. 그래서 처음엔 script를 만들었다. manifest 파일을 수정하는 script. 처음엔 만족스러웠지만 사실 manifest를 수정한다는건 (자동이든 수동이든) 부담도 있고 비효율적이다. 결국은 GIT config를 변경해서 script를 사용하지 않고도 문제를 해결할 수 있었다.

3. GIT config의 종류

Gerrit / repo 모두 GIT을 사용하기 때문에 GIT 설정만으로도 위의 문제를 해결하는게 가능한데, 우선 GIT의 설정은 크게 세 가지로 나뉜다.

local, global, system 설정이 그것인데 각각 저장소 대상 개별 설정, 사용자 대상 설정, 전체 사용자(시스템) 대상 설정을 의미한다.

git config 명령에 option으로 설정 범위를 선택하는게 가능한데 설정된 내용은 각각 $GIT_DIR/config, ~/.gitconfig, $(prefix)/etc/gitconfig 파일에 기록된다.

그러므로 config 명령을 사용하기 싫으면 각각의 파일을 직접 수정해도 무방하다.

4. GIT url insteadof 설정

아래와 같은 형태의 설정을 하면 GIT으로 요청하는 모든 url 중에 해당되는 url을 대체하는게 가능하다

url.<base>.insteadOf (당연히 대소문자 구분)

예를 들어, http://test.com에 대한 요청을 ssh://test@test.com:29418 로 변경하고자 한다면 이렇게 설정하기만 하면 간단히 정리된다.

git config --global url.ssh://test@test.com:29418.insteadOf http://test.com

 

이렇게 해결.

그런데 설정 형식이 조금 못생겼다는 생각을 지울수가 없다. 마침표를 왜 넣지? 다른 방법도 있었을텐데.

· 2 min read

Linux에서 파일을 생성할 때 갖게 되는 권한의 default 값이 있다.

git을 사용하고 있어서 서버에 원격저장소를 하나 두고 있는데 어떤 사용자가 파일을 생성하거나 수정한 후 다른 사용자가 해당 파일을 수정하지 못하는 문제가 발생했다. 확인해보니 objects 디렉토리에 있는 파일들 (아마도 파일 변경사항에 대한 데이터로 추측됨)의 권한이 모두 644로 설정되어 있는 상태. 파일들 생성시마다 기본 권한을 group도 쓰기가 가능하도록 만들어야 했기 때문에 umask 명령을 사용했다.

umask는 un masking을 의미하며 기본값은 022로 설정되어 있는데 파일은 666, 디렉토리는 777 권한에서 022로 un masking 한 결과를 파일 생성시 권한으로 설정하는 것 같다. 나의 경우엔 group 구성원들에게 쓰기권한을 부여할 수 있도록 umask 002로 설정했는데, 설정이 유지되는 것 같지는 않다. (로그아웃 후 다시 로그인해서 확인해보면 022로 초기화 되어있음)

그래서 일반적인 linux 시작 스크립트 (나의 경우엔 /etc/profile)에 추가해서 해결.

· One min read

 개발되는 코드를 git으로 관리하기로 결정하면서 git public repository 설정 중.

리눅스 서버에서 구축해야 하나 여러가지 이유로 윈도우에서 확인하고 있다. ssh로 인증하게 되어있어서 몇가지 문제점이 있었으나 인증 문제는 해결되었다. 지금 남아있는 문제는 문자열 길이가 맞지 않는다는 오류 메세지인데 추측되는 원인은 있으나 아직 조치하지 못하고 있음.

내일은 완전히 해결할 수 있기를...아니 해결한다!

· 6 min read

개인적인 사정으로 맥북에서 Android full source를 다운받아서 빌드할 일이 생겼다. Google에서 Mac OS X의 경우에 어떻게 다운로드해서 빌드해야 하는지 설명하고 있지만 그대로 진행했을 경우에 문제점들이 몇가지 있어서 그 부분에 대해 정리해볼까 한다.

 

우선 문제점들이 발생하는 이유는 시간이 흘러서 변경사항이 생겼거나 개인의 환경설정 차이에서 기인하는 것으로 보이는데 일단 내 기준으로 환경을 요약하면 아래와 같다.

OS X 10.6.6, JDK 6 (OS에 기본적으로 탑재된 상태), Macports 설치됨.

Download 참조 페이지 : http://source.android.com/source/download.html

 

#1. 첫번째 문제

위의 페이지대로 진행하다보면 terminal에서 아래와 같은 command를 입력해야 하는 부분이 있다.

$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg

 

설치된 macports로 gmake, libsdl, git-core, gnupg를 내려받아 설치하는 command인데 나의 경우엔 libsdl 설치 도중 오류와 함께 중단되는 경우가 발생했다. Command 포함 오류 메세지는 아래와 같음.

 

$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg
--->  Computing dependencies for gmake
--->  Cleaning gmake
--->  Computing dependencies for libsdl
--->  Dependencies to be installed: xorg-libXext xorg-libX11 xorg-libxcb python27 db46 gdbm openssl zlib readline sqlite3 xorg-libpthread-stubs xorg-xcb-proto libxml2 xorg-util-macros xorg-xcmiscproto xorg-xextproto xorg-xf86bigfontproto xorg-xtrans xorg-libXrandr xorg-randrproto xrender xorg-renderproto
--->  Configuring db46
Error: db46 requires the Java for Mac OS X development headers.
Error: Download the Java Developer Package from: <https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719>;
Error: Target org.macports.configure returned: missing Java headers
Error: Failed to install db46
Log for db46 is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_databases_db46/main.log
Error: The following dependencies were not installed: xorg-libXext xorg-libX11 xorg-libxcb python27 db46 gdbm openssl zlib readline sqlite3 xorg-libpthread-stubs xorg-xcb-proto libxml2 xorg-util-macros xorg-xcmiscproto xorg-xextproto xorg-xf86bigfontproto xorg-xtrans xorg-libXrandr xorg-randrproto xrender xorg-renderproto
Error: Status 1 encountered during processing.
To report a bug, see <http://guide.macports.org\/#project.tickets>;

 

문제가 되는건 libsdl 설치할 때 dependency를 가진 다른 모듈들을 설치하는데 db46 이란 녀석이 말썽인거다. 왜 이런 일이 생기는 걸까? 위의 오류 메세지 중에 보면 Download the Java Developer Package from: 어쩌구 하는 부분(빨간색)이 있는데 위의 url로 다운받을 때 문제가 생기는 것으로 보인다. 여기저기 찾아보니 아마 apple 내부에서 어떠한 이유로 url을 변경한 것으로 생각되는데 실제로 위의 url을 입력해보면 redirect 되어 다른 페이지로 이동되는걸 확인할 수 있다. macports는 그 작업을 해주지 않는 것으로 생각되기 때문에 당연히 실패로 끝나는거고.

 

해결책은 무척 간단하다. 위의 문제가 되는 url을 직접 입력해 redirect 되는 페이지에 접근해보면 download 할 수 있게 되어있으니 직접 download 하고 설치하면 끝. 그리고 다시 위의 command를 입력해 진행하면 문제없이 모든게 설치된다.

 

#2. 두번째 문제

또 하나 알게된 사실은 Google에서 제공하는 git repository에서 source를 다운받는데 특정 branch가 사라졌다는 거. Source 다운로드를 위한 모든 잡다구레한게 제대로 설치된 상태에서 repo를 만들기 위해 아래와 같은 command를 입력하라고 google에서 친절하게 알려주고 있다.

$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

 

위의 command는 cupcake branch만 다운로드 하기 위해서 repo를 만드는건데, google의 설명을 보면 mainbranch를 원하면 -b 옵션없이 입력하라고 되어있다. 난 gingerbread 까지는 필요없었고 froyo가 적당하다고 판단했기 때문에 -b froyo라고 입력했는데 이런. 오류가 막 생긴다. 역시 찾아보니 froyo라는 branch를 없앤걸로 보이는데 대신 froyo-plus-aosp 라는 이름의 branch 사용은 가능하다. 역시 -b froyo-plus-aosp 로 입력하면 정상적으로 다운로드 가능. 근데 왜 froyo branch를 없앤걸까??

 

 

참조

1. Failed to install db46 (for git-core) : http://comments.gmane.org/gmane.os.apple.macports.user/22266

2. Failed to get froyo : http://groups.google.com/group/android-porting/browse_thread/thread/1dc55cf079291abc/ab1a9ee55681f95f?show_docid=ab1a9ee55681f95f#