태그라는걸 알게되서 정리해본다.
(git-scm 에서 내용들을 훑어 보았고, 그곳의 내용으로 정리해본다.)
보통 릴리즈할 때 사용한다고 한다(v1.0, 등등).
우선 git tag
명령으로 이미 만들어진 태그가 있는지 확인할 수 있다.
1 | git tag |
이 명령은 알파벳 순서로 태그를 보여준다. 사실 순서는 별로 중요한 게 아니다.
검색 패턴을 사용하여 태그를 검색할 수 있다. Git 소스 저장소는 240여 개의 태그가 있다. 만약 1.4.2 버전의 태그들만 검색하고 싶으면 아래와 같이 실행한다.
1 | git tag -l 'v1.4.2.*' |
Git의 태그는 Lightweight 태그와 Annotated 태그, 두 종류가 있다. Lightweight 태그는 브랜치와 비슷한데 브랜치처럼 가리키는 지점을 치신 커밋으로 이동시키지 않는다.
단순히 특정 커밋에 대한 포인터일 뿐이다.
한편, Annotated 태그는 Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 그리고 태그 메시지도 저장한다. 또 GPG(GNU Privacy Guard)로 서명할 수도 있다.
이 모든 정보를 저장해둬야 할 때에만 Annotated 태그를 추천한다.
그냥 다른 정보를 저장하지 않는 단순한 태그가 필요하다면 Lightweight 태그를 사용하는것이 좋다.
Annotated
태그를 만드는 방법은 간단하다. tag
명령을 실행할 때 -a
옵션을 추가한다.1
2
3git tag -a v1.0 -m "version 1.0"
git tag
v1.0
-m
옵션으로 태그를 저장할 때 메시지를 함께 저장할 수 있다. 명령을 실행할 때 메시지를 이볅하지 않으면 Git은 편집기를 실행시킨다.
git show
명령으로 태그 정보와 커밋 정보를 모두 확인 할 수 있다.
1 | git show v1.0 |
커밋 정보를 보여주기 전에 먼저 태그를 만든사람이 누구인지, 언제 태그를 만들었는지, 그리고 태그 메시지가 무엇인지 보여준다.
git push
명령은 자동으로 리모트 서버에 태그를 전송하지 않는다. 태그를 만들었으면 서버에 별도로 Push 해야 한다. 브랜치를 공유하는 것과 같은 방법으로 할 수 있다.
git push origin [태그 이름]
을 실행한다.1
2
3
4
5
6
7git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
만약 한 번에 태그를 여러게 Push 하고 싶으면 --tags
옵션을 추가하여 git push
명령을 실행한다. 이 명령으로 리모트 서버에 없는 태그를 모두 전송할 수 있다.1
2
3
4
5
6
7
8
9
10
11git push origin --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
* [new tag] v0.1 -> v0.1
* [new tag] v1.2 -> v1.2
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
* [new tag] v1.5 -> v1.5
누군가 저장소에서 Clone 하거나 Pull 을 하면 모든 태그 정보도 함께 전송된다.
]]>Git에서 커밋 할때에, 불필요한 파일을 숨겨주고 싶었다..gitignore
설정을 하면 된다고 한다.
그리고, ignore 를 모아놓은곳을 찾았다.
1 | # MacOs |
1 | # Windows |
git add
를 할 때에 아래의 경고를 만났다.1 | warning: CRLF will be replaced by LF in index.html. |
경고: CRLF 는 index.html 의 LF로 대체됩니다.
파일은 작업 디렉토리에 원래의 줄 끝을 갖습니다.
CRLF
, CR
, LF
? 이게 뭐지?찾아보니, 윈도우(Windows)는 CR
(Carriage Retrun) 과 LF
(Line Feed) 문자를 둘 다 사용하지만, Unix
, Linux
, MacOS
는 LF
문자만을 사용한다고 한다.
함께 협업하는 인원들이 한 가지 운영체제를 사용한다면 별 문제가 없겠지만, 아닐경우 불편한 문제가 생기는것 같다.
실제로 소스코드의 변함이 없는데, 이 문제로 소스코드가 변경되었다고 판단하는 듯 하다.
더 찾다보니, 위키에서 새줄 문자 라는걸 찾았는데,CRLF
, CR
, LF
만 있는게 아니었다(오 머리 아파).
구분 | 설명 |
---|---|
LF | 라인 피드(Line Feed), U+000A |
FF | 폼 피드(Form Feed), U+000C |
CR | 캐리지 리턴(Carriage Return), U+000D |
CR+LF | 연속된 CR과 LF |
NEL | 다음 줄(Next Line), U+0085 |
LS | 줄 구분자(Line Separator), U+2028 |
PS | 문단 구분자(Paragraph Separator), U+2029 |
뭐 결국은, 어떻게 해야 할까이고..
각각 설정하는 방법도 여기저기서 찾았는데,
나는 각 저장소(repository)별로 속성을 지정해서 설정을 강제하는 방법을 사용하기로 했다.
(같이 협업하는 인원들에게 이건 이렇게 해주시고, 저건 저렇게 해주세요 보다는 훨씬 공수가 덜 들어간다고 생각했다.)
.gitattributes
설정.gitattributes
파일을 생성하고 아래 내용을 기록한다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# Auto detect text files and perform LF normalization
# 텍스트 파일 자동 감지 및 LF 정규화 수행
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
# 절대경로는 괜찮다
/**/postinst* text eol-lf
# paths that don't start with / are treated relative to the .gitattributes folder
# .gitattributes 와 관련하여 /로 시작하지 않는 경로
relative/path/*.txt text eol-lf
git pull
시 fatal: refusing to merge unrelated histories
가 PC에서
새로운 저장소(repositories)를 clone
하고,index.html
을 아래와 같이 생성하여 add
, commit
, push
를 했다.
1 | Hello, world |
1 | git add index.html |
나 PC에서도 새로운 저장소를 clone
하고,
폴더를 만들고 예제 파일들을 만들고 있었다.
내가 가 PC
에서 푸시했다고 나 PC
의 SJ
님에게 알려줬다.나 PC
의 SJ
님은 git pull
을 시도했고,
아래와 같이 fatal: refusing to merge unrelated histories
라는 문장을 보게 되었고,git pull
이 완료되지 않았다.
1 | git pull |
공식적인 이유는 다음과 같다고 한다.
“git merge” used to allow merging two branches that have no common base by default, which led to a brand new history of an existing project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the existing project. The command has been taught not to allow this by default, with an escape hatch “–allow-unrelated-histories” option to be used in a rare event that merges histories of two projects that started their lives independently
“git merge”는 기본적으로 공통 기반이없는 두 개의 분기를 병합하여 기존 프로젝트의 새로운 히스토리를 작성한 후 예상치 못한 관리자가 가져온 것으로, 불필요한 병행 이력이 기존 프로젝트에 병합되도록 허용하는 데 사용되었습니다 . 이 명령은 기본적으로 허용하지 않도록 배웠습니다. 독립된 삶을 시작한 두 프로젝트의 기록을 병합하는 드문 이벤트에서 탈출 해치
--allow-unrelated-histories
옵션을 사용할 수 있습니다.
아래와 같이 하면 git pull
이 잘 수행된다.1
git pull origin <branch> --allow-unrelated-histories
1 | <a href="http://www.facebook.com/sharer/sharer.php?u=domain.com" target="_blank">페이스북 공유</a> |
페이스북 앱 아이디가 필요한것 같다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28$('#snsFb').on('click', function(e){
e.preventDefault();
$.ajaxSetup({ cache: true });
$.getScript('//connect.facebook.net/ko_KR/sdk.js', function(){
FB.init({
appId:'your facebook app id',
version: 'v3.2'
});
FB.ui({
method: 'share',
title: '공유 테스트',
description: '공유 테스트를 진행',
href: 'https://daum.net'
}, function(response){
if(response && !response.error_code) {
alert('공유 완료');
} else {
alert('공유 실패');
}
})
});
});
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment
]]>blog 폴더로 이동해서,
1 | npm install hexo-codepen-v2 --save |
1 | {% codepen slugHash default_tabs height width userId|anonymous|anon theme %} |
CodePen
에서 생성된 것.1 | <p class="codepen" data-height="265" data-theme-id="0" data-default-tab="result" data-user="njean" data-slug-hash="xBKjZE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="select local"> |
구분 | 값 |
---|---|
userId | njean |
slugHash | xBKjZE |
theme | 0 |
default_tabs | result |
height | 265 |
width | 이 값은 블로그 테마에 따라 조정되어야 하며 기본적으로 100% |
slugHash
를 제외한이 설정은 모두 codepen 속성의 _config.yml
에서 설정할 수 있다.
1 | codepen: |
겨울을 넘어 봄 바람이 올락말락 하는데에,
진행하고 있는 프로젝트에서, 매장정보를 가져올일이 생겼다.
이미 본사에서 사용하고 있는 매장정보 API
를 주면, ajax
를 통해 가져오면 되겠지 하고 망연히 있었다.
그런데, 매장정보를 가져오는 부분이 기획서에 없어(out)! 졌더라.
없어졌으니까, “아, 없어졌구나.”라고 중얼 거린후, 다른거 하면서 망연히 있었다.
그렇게 시간은 흐르다가, 갑자기 매장정보를 가져오는게 기획서에 딱!하고 업데이트되어 있었다.
API
를 줄 수 없다! 고 하였다.일단 받은 엑셀 문서를 살펴보았는데,
무지막지하게 많지는 않았지만(음 그래도 음. 음. 음. 음.)..
암튼, 이걸 어떻게 하지?
지역별로 나눠서 어케 해보자 하고 .json
형식으로 변환을 했다.
1 | [ |
그리고, 만든 json
형식의 아이를 $scope.stores
안에 data
를 만들고 할당해줬다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50$scope.stores = {
// 시도 모델
sidoModel: null,
// 매장 모델
store: {
code: null, // 매장 코드
name: null // 매장 이름
},
// 매장(items) 데이터
sdata: [],
// 지역 및 매장 정보
data: storeData,
// 지역 변경
change: function(){
var local;
$scope.stores.sdata = [];
if( $scope.stores.data[$scope.stores.sidoModel] !== undefined ) {
$scope.stores.sdata = $scope.stores.data[$scope.stores.sidoModel].items;
local = $scope.stores.data[ $scope.stores.sidoModel ].city;
}
},
// 매장명 가져오기
getName: function( store ){
var storeCode = $scope.stores.store.code,
storeName = $.grep( $scope.stores.sdata, function( store ) {
return store.code === storeCode;
});
if( storeName.length > 0 ) {
storeName = storeName[0].name;
}
$scope.stores.store.name = storeName;
}
};
timeago
를 사용하면 이를 쉽게 구현해준다.1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.5/jquery.timeago.min.js"></script> |
한국어로 표현하고 싶다면, localses 의 jquery.timeago.ko.js
를 추가로 포함한다.1
2<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.5/jquery.timeago.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.5/locales/jquery.timeago.ko.js"></script>
1 | <!-- 시간은 yyyy-mm-dd hh:ii:ss 형식으로 넣어준다 --> |
1 | $(document).ready(function(){ |
hexo
를 설치해보았다.1 | npm install hexo-cli -g |
1 | hexo init blog |
여기서 문제가 발생해버린다. 다음 내용을 보여주며 안된다.1
command not found: hexo
hexo
를 찾을수 없다고 나온다..bash_profile
에 환경변수 설정을 해보아도 마찬가지.
.zshrc
파일을 열어보니까, 아래와 같은 내용이 보였다.1
2
3# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
그래서 아래와 같이 해봤다.1
alias hexo="/Users/{{accouts}}/.npm-global/bin/lib/node_modules/hexo-cli/bin/hexo"
오, 잘된다.
]]>(Fullscreen API)
를 사용할 일이 있었다.사용자가 전체화면상태에 진입을 한 후, 이전 버튼을 이용하여 전체화면 상태를 중지했을때 뷰포트(Viewport)가 깨지는 문제가 발생했다.
나는 삼성 갤럭시(Samsung Galaxy) S8에서 해당 현상을 발견했고,
삼성 갤럭시 S8 의 기본 브라우저가 구글 크롬(Google Chrome)
인 줄 알고 있었는데,인터넷
이라는 이름이 붙은 삼성 인터넷(samsung internet)
웹 브라우저에 생기는 문제였다.
위에서 뷰포트가 깨지는 문제가 발생했다고 했는데, 정확한 증상은
user-scalable=no
로 지정한 확대/축소 금지 옵션이 무시되었다.즉 작성자가 의도한 화면을 무시하고, 사용자 마음대로 확대 축소 시킬수 있는 문제가 생겼다.
삼성인터넷에 대해 구글링을 해보다가, 삼성인터넷 깃허브에서 해당 이슈를 찾을 수 있었는데,
삼성인터넷 v5.4 이후로 발견된 현상이라고 한다.
그리고 이슈로 등록되어 있고, 이슈가 Closed 되어 있어 해결방법이 있는줄 알았다.
그런데, 이를 해결할 수 있는 방법으로는 사용자가 직접 설정에 접근하여, 어떤 옵션을 꺼야 한다고 한다.
설정 > 화면(Settings > Manual zoom) 수동확대 끄기
해당 옵션은 웹사이트의 설정과 관계없이 손가락으로 화면을 확대할 수 있습니다.
라는 설명이 붙어있는데, 이 옵션을 꺼버리면, 작성자가 의도한대로 화면이 잘 나온다.
그런데, 문제는 웹사이트를 작성하는 사람이 접근할 수 있는 방법이 없는것으로 보인다.
웹 사이트를 이용하는 사용자가 직접 설정해야 문제가 해결된다.
왜 이게 기본적으로 활성화 되어 있는지 이해할 수가 없다.