#TIL #git remote 저장소에서 지워진 브랜치를 로컬에 반영

$ git fetch --prune
$ git pull --prune

--prune 옵션을 사용하면 된다.

$ git config --global fetch.prune true

리모트 저장소에서 지워진 branch를 로컬에 유지할 필요가 없다. 쌓여서 문제지. 이제 git fetch, git pull 명령을 입력할 때, 옵션을 안 붙여도 된다.

--prune

Before fetching, remove any remote-tracking references that no longer exist on the remote. [.]

- https://git-scm.com/docs/git-fetch

branch는 ‘나뭇가지’란 뜻도 있으니 ‘가지 치다’란 뜻을 가진 prune을 사용했나 보다. 네이밍 센스 좋다.

참고

#TIL #git 알아서 upstream을 설정해주는 push alias

[alias]
  pu = "!f() { \
         [[ $(git config \"branch.$(git symbolic-ref --short HEAD).merge\") = '' ]] && \
         git push -u origin $(git symbolic-ref --short HEAD) $@ || \
         git push $@; \
       }; f"

.gitconfig 파일에 추가한다. 커맨드라인 명령어로 추가하려고 했다. 에러 메시지가 뜨는데, 뭐가 문제인지 모르겠다. 에라이. 그냥 config 파일을 직접 수정했다.

두가지 전제 조건이 있다. remote는 origin 고정이다. remote와 local 브랜치 이름이 같다.

$ git checkout feature-1
$ git pu

feature-1 브랜치 upstream 저장소 설정 여부에 따라 둘 중 하나로 실행된다.

$ git push -u origin feature-1

또는

$ git push

참고

#TIL #bash #git prompt 적용하기

ohyecloudy@air5  ~/project/ddiary (master)
$

그냥 맘 편히 git-for-windows에서 제공하는 프롬프트를 쓰고 싶다. 단순해서 마음에 든다. 체크아웃 브랜치 정보만 보여줘도 충분하다.

Emacs에서 shell을 띄우니 프롬프트가 이상해진다. 그래서 프롬프트를 직접 bashrc에 정의하기로 했다. 복사해서 정의하고 문제가 되는 부분에서 분기를 타려고.

git-prompt.shgit-completion.bash 파일이 필요하다. 둘다 github/git 리파지토리에 있다.

git-for-windows에서 사용 중인 prompt에서 원하는 부분을 복사해서 붙였다.

적용한 스크립트는 d323c60 커밋에서 볼 수 있다.

#TIL #ExifTool 찍은 날짜 디렉터리로 자동 분류

지오태깅 프로그램을 찾다가 ExifTool을 알게 됐다. 기능 많네. 지오태깅 뿐만 아니라 rename, move도 지원한다.

$ exiftool -d %Y-%m-%d "-directory<datetimeoriginal" image_dir

찍은 날짜로 디렉터리를 만들고 이미지를 옮긴다.

#TIL #ExifTool 이미지에 지오태깅

지오태깅이 안 되는 옛날 카메라를 사용하고 있다. GPS 로그는 Moves 앱을 사용해서 기록하고 Moves Export를 사용해서 GPX 포맷으로 저장한다.

GPX 포맷으로 저장된 GPS 로그 데이터를 바탕으로 찍은 사진에 GPS 태그를 추가해 줘야 한다. 프로그램을 찾아보다가 ExifTool을 발견했다.

$ exiftool -geotag "c:\gps logs\track.log" c:\images

잘 된다.

#TIL #bash find 명령어 결과에서 permission denied 에러 메시지 숨기기

$ find / -name 'to_be_searched.file'

permission denied 메시지 작렬. 뭘 보지를 못하겠네. 이 메시지만 걸러내는 방법은 없을까?

$ find / -name 'to_be_searched.file' 2>/dev/null

간단하다. stderr(standard error)널 디바이스(null device)로 리다이렉션하면 된다.

에러 메시지 출력에 std::cerr 안 쓰고 std::cout 썼다면 망. linux 커맨드라인 유틸리티 바닥은 칼같이 지켜서 stderr를 리다이렉션만 하면 된다.

참고

#TIL MSYS2? MinGW?

MSYS2 refers to the libraries and programs that use the POSIX emulation layer (“msys2 runtime”, derived from Cygwin’s cygwin1.dll). It is very easy to port libraries and programs from Unix/Linux because most of the POSIX semantics is emulated reasonably well, for example the fork() function. Bash and Perl are examples of MSYS2 programs.

MinGW refers to libraries and programs that are compiled using GNU tools but do not require any POSIX semantics, instead relying on the standard Win32 API and the C runtime library. MinGW stands for “Minimal GNU for Windows”. Examples: cURL (a library to talk to remote servers via HTTP(S), (S)FTP, etc), emacs, Inkscape, etc

The POSIX emulation layer of MSYS2 binaries is convenient, but comes at a cost: Typically, MSYS2 programs are noticably slower than their MinGW counterparts (if there are such counterparts). As a consequence, the Git for Windows project tries to provide as many components as possible as MinGW binaries.

- The difference between MSYS2 and MinGW / git-for-windows

POSIX 에뮬레이션 레이어가 기반이냐 아니냐가 가장 큰 차이다. POSIX 에뮬레이션 레이어를 거치면 속도가 현저하게 느려진다. Win32 API와 C runtime library에 의존하는 MinGW는 MSYS2보다 빠르다. 그래서 Git For Windows는 가능한 많은 MinGW 바이너리를 제공하려고 노력한다.

어떻게 잘 버무려 쓸까? 나는 이런 고민 안 하고 잘 버무려진 Git for Windows SDK 쓴다.

#TIL #jenkins 메일에 많은 정보를 담자

${BUILD_LOG_MULTILINE_REGEX, regex=".*error [A-Z]+[0-9]+:.*"}

Email-ext plugin을 사용하면 콘솔 로그 메시지를 정규식(regular expression)으로 찾을 수 있다. MSVC 경고, 에러 메시지를 이메일 내용 가장 앞에 넣을 수 있다. 실패하면 이게 가장 궁금하니깐.

${BUILD_LOG_MULTILINE_REGEX} 이런 콘텐츠 토큰 종류와 설명은 Content Token Reference 옆 ? 아이콘을 클릭하면 나온다. 한참 찾았네.

#TIL #git 코드가 삭제된 커밋 찾기

$ git log -SText

Text 문자열이 삭제된 커밋을 찾는다.

-S<string> Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.

It is useful when you’re looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block.

사실 삭제만 찾는 게 아니라 추가와 삭제를 모두 찾는다.

정규식을 사용하려면 -G 옵션을 사용. 대소문자 무시하고 찾으려면 -i 옵션을 사용하면 된다.

참고

#TIL #batch backslash를 slash로 바꾸기

set TEST_VAR=C:\test\data\test.txt
set TEST_VAR=%TEST_VAR:\=/%
echo %TEST_VAR%

변수 replace를 사용해서 \ 문자를 / 문자로 변경한다.

SET _no_spaces=%_some_var: =%

공백도 쉽게 없앨 수 있다.

참고

#TIL #jenkins 스크립트로 환경 변수를 설정하고 싶다면

echo ENV_1=%ENV_1%>propsfile
echo ENV_2=%ENV_2%>>propsfile

- Create an Inject environment variables build step and set "Properties File Path" to propsfile.

젠킨스 빌드 스텝에서 고정된 환경 변수를 사용한다면 Properties Content를 사용하면 된다. 빌드 파라미터에 영향을 받는다면 다른 방법을 찾아야 한다. 환경 변수를 세팅하는 빌드 스텝에서 파일을 만들고 Properties File Path에 만든 파일 경로를 입력한다.

EnvInject 플러그인이 필요함.

참고

#TIL #batch path를 디렉토리와 파일로 분리하기

C:\>FOR %A in ("C:\Users\ohyecloudy\test folder\test.txt") DO @ECHO %~dpA
C:\Users\ohyecloudy\test folder\
C:\>FOR %A in ("C:\Users\ohyecloudy\test folder\test.txt") DO @ECHO %~nxA
test.txt

배치 스크립트(batch script) 안에서는 % 문자를 두 개 사용.

%~dp1 Expand %1 to a drive letter and path only
%~nx2 Expand %2 to a file name and extension only

parameter extensions로 지원한다.

참고

#TIL #batch 왜 echo로 파일에 리다이렉션할 때, 뒤에 공백이 생기는걸까?

C:\>ECHO abcd > test.txt

이렇게 하니깐 test.txt에 abcd 다음에 trailing whitespace가 붙는다. 어떻게 없애지?

C:\>ECHO abcd>test.txt

이렇게 > 리다이렉션 연산자(redirection operator) 앞에 공백을 안 주면 된다. ㅋㅋㅋ 이거 너무 간단하잖아. 표현식에 space를 무시하는 cpp에 길들어서 이렇게 됐다.

참고: echo / batch redirect to file automatically appends space? - stackoverflow

#TIL #batch 파일을 읽어 변수에 할당

set /p VERSION=<version.txt

set /p 명령어를 사용하면 된다. for /f 명령어를 사용해도 된다. set /p 명령어는 파일이 여러 줄일 때, 첫 줄이 적용되는 데 반해 for /f 명령어는 마지막 줄이 적용된다.

참고 - How to read file contents into a variable in a batch file? - stackoverflow

#TIL #vim 찾기 이후 찾은 단 강조를 지우고 싶을 때

* 키로 찾던가 아님 / 커맨드로 찾던가하면 일치하는 단어가 강조된다. 다음 찾기를 할 때까지 강조가 유지된다. 지우고 싶을 때면 /adfafddsaf 처럼 일치하는 단어가 없게 마구잡이로 넣어서 강조를 지웠다.

:noh

:nohlsearch 커맨드를 입력하면 된다. 그럼 현재 단어 강조가 사라짐.

nnoremap <silent> <C-L> :nohlsearch<CR><C-L>

매번 :noh 치기가 귀찮아서 How can I clear word highlighting in the current document (e.g. such as after searching for a word)? 글을 참고해 C-L 키 바인딩을 만들었다.

#TIL #vim 알만(Allman) 스타일 들여쓰기라면 대괄호(Square brackets, [ ]) 키로 뛰어넘자

]] sections forward or to the next ‘{’ in the first column.

][ sections forward or to the next ‘}’ in the first column.

[[ sections backward or to the previous ‘{’ in the first column.

[] sections backward or to the previous ‘}’ in the first column.

- Vim documentation: motion

첫 번째 컬럼에 있는 { 또는 } 문자 단위로 움직인다. c++ 같은 언어에서 Allman style로 들여 쓴다면 class, function, enum, … 단위로 움직일 수 있다.

#TIL #MacOS KeyCastr 키스트로크를 화면에 출력하고 싶다면?

/ddiary/assets/2016-12-13-til-macos-keycastr.gif

$ which cask || brew tap caskroom/cask
$ brew cask install keycastr

맥 소프트웨어는 예쁘다. windows에서는 마음에 드는 거 못 찾았다.

github - https://github.com/keycastr/keycastr

#TIL #unix 파일 크기가 알고 싶을 때

$ du -h ~/.emacs.d/init.el
8.0K    /Users/ohyecloudy/.emacs.d/init.el

$ du -h ~/.emacs.d/init.el | cut -f1
8.0K

du(disk usage) 명령어를 사용하면 된다. 파일 크기와 path를 같이 보여주는데, cut 명령어로 파일 크기만 볼 수도 있다.

참고 - How can I get the size of a file in a bash script? - unix.stackexchange.com

#TIL #xcode #vim 지원 플러그인 xvim

Since Apple decided not to load 3rd party plugins, we have to make change to it. What we have to do overall is to re-codesign Xcode. This allows us to load 3rd party plugins. Here’s the steps to do.

- Install XVim for Xcode 8

플러그인 좀 쓰게 해주지. xcode 8에서는 그냥 못 쓴다.

$ time sudo codesign -f -s ohyecloudy /Applications/Xcode.app
Password:
/Applications/Xcode.app: replacing existing signature

real    9m18.128s
user    3m9.576s
sys    2m46.899s

그냥 못 쓰고 코드 사인을 다시 해야 한다. 배포에는 문제가 생기지 않을까? 몰라. 시간이 지나면 해결되겠지. 아니면 배포용 빌드를 만들 때, xcode를 한 벌 더 설치해야 한다.

망했어. vim 키바인딩이 없으면 아무것도 못 하겠다.

링크

#TIL #macos #unix 명령어로 맥 모델 식별하기

$ curl -s http://support-sp.apple.com/sp/product?cc=`system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-` | sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'
MacBook Air (13-inch, Late 2010)

AWK 명령어로 Serial로 시작하는 줄에서 시리얼 번호를 추출. cut 명령어로 마지막 문자 4개만 남기고 잘라낸다. 응답으로 받은 문자열에서 <configCode> 태그 내용을 sed로 치환.

모델명 출력하고 나니 따끈따끈한 신상 맥북 사고 싶다.

참고