2011-02-01 2 views
3

순전히 투기적인 커밋이 있다고 가정 해 봅시다. 나는 그것을 지키고 싶다. 그러나 나는 심판을 만들고 싶지 않다. (나는 지목이나 '단일 한 투기 적 커밋'이라는 태그를 원하지 않는다.) 분기 이름을 '투기 적'으로 만들고 모든 커밋을 그 안에 포함시킬 수는 있지만 커밋은 완전히 서로 관련이 없으므로 커밋과 그 부모 간의 연결이 터무니 없다. 본질적으로, 나는 gc에 의해 삭제되지 않을 커밋에 대해 sha1 ids를 나열 할 수 있기를 원하지만 각각에 대한 참조는 필요 없다. 그렇게하는 좋은 방법은 무엇입니까? (나는 gc.pruneExpire를 높은 값으로 설정하고 싶지 않다. 왜냐하면 나는 여전히 물건을 가지 치기를 원하기 때문에, 참조되지 않은 커밋의 특정 세트를 유지하기 만하면된다.) 다른 말로하면 :어떻게 커밋을 삭제하지 않았는지 확인 하시겠습니까?

무엇인가 전혀 관련이없는 커밋들에 대한 참조를 만드는 좋은 방법?

답변

3

해결 방법은 비교적 간단합니다.

 
$ git update-ref refs/speculative/SHA1 SHA1 

git-gc는 ref를 존중하고 삭제하지 않는 것 같습니다.

 
$ git show-ref | grep refs/speculative 

지금까지 발견 유일한 단점은 머리를 발견 잃어 버렸 즉 자식 fsck를들이 매달려 있습니다보고 있습니다 : 보호 된 커밋은 쉽게 나열 할 수 있습니다.

+0

'git fsck'에'HEAD'를 건네주지 마십시오 - HEAD 외부에 커밋이 있으면 댕글 링 커밋이 발생합니다. 대신에'git fsck --unreachable'을 수행해야합니다. – bdonlan

+0

+1 : 저는이 것을 mipadi의 대답에 대한 대안으로 제안하려했습니다. 몇 가지주의 사항 : 나중에 SHA1만이 아니라 실제 명칭을 주어야한다. 그것들은 네임 스페이스 밖에있는 가지 나 태그와 같습니다. 다른 ref와 마찬가지로 설명을 붙이십시오. 'git for-each-ref refs/speculative/*'를 사용하여 이들을 나열 할 수 있는데,이 옵션은 좋은 서식 지정 옵션을 제공합니다. – Cascabel

+0

고유성을 보장하고 이름을 지정하는 데 필요한 노력을 최소화하기 위해 이름으로 sha1을 사용하기로 결정했습니다. 각 커밋 메시지의 첫 번째 줄을 나열하면 쉽게 구분할 수 있습니다. –

2

git stash을 사용할 수 있습니다. 이것은 기본적으로 'stash'라는 참조와 연결되는 다른 목록으로, git show-branch과 같은 모든 도구는 무시합니다.

또는 가짜 리모콘에서 각각에 대해 분기를 사용할 수 있습니다. refs/remotes/graveyard/an-experiment--branches에 포함되지 않지만 --all에 포함되므로 제거되지 않습니다.

+1

'git stash'를 사용하는 것은'git stash'의 정상적인 사용에 방해가 될 수 있으므로 사용하지 않는 것이 좋습니다. 즉, 작업 진행중인 데이터의 임시 저장 – bdonlan

+0

잠시 동안 은신처를 가지고 놀았지만 들어옵니다 stashing을 위해 은신처를 사용하는 방법. 가짜 리모컨은 좋은 생각입니다. 하지만 여전히 각각에 대해 고유 한 이름이 필요합니다. 맞습니까? 차라리 분기 이름보다 커밋 메시지에 설명을 넣을 것입니다. –

+0

설명을 원격에 배치하기 전에 커밋에 넣을 수 있습니다. 전체 브랜치 설명을 위해 추가 'envelope'커밋을 추가하려면'git commit --allow-empty'를 사용하여 끝에 빈 커밋을 추가하십시오. – bdonlan

4

경량 태그를 사용하여 커밋에 태그를 지정하기 만하면됩니다. 나는 그것이 당신이 정말로 원하는 해결책이 아니라는 것을 알고 있습니다. 그러나 그것은 제 의견으로는 최고의 것입니다. 태그가있는 커밋은 결코 삭제되지 않으며 분기를 나열 할 때 커밋되지 않습니다. 태그를 나열 할 때 태그를 표시하지만, 실제로 표시하지 않으려면 각 태그 앞에 공통 접두사를 붙이고 git 별칭을 사용하여 태그를 필터링 할 수 있습니다. 다음과 같음 :

[alias] 
    tags = !sh -c 'git tag | grep -v my_prefix' 
관련 문제