2013-07-10 3 views
11

내 변경 사항을 git에 저장하고 git stash apply으로 다시 적용하는 습관이 있습니다. 이것은 제가 실수로 숨겨진 것을 잃지 않게하는 장점이 있습니다. 그러나 내 속표지가 오히려 빨리 성장한다는 것을 의미합니다.특정 브랜치와 관련된 모든 숨김을 버리십시오.

분기가 끝나면 숨겨진 목록을 통해 돌아가서 분기와 관련된 모든 숨김을 수동으로 제거합니다. 단일 명령으로이 작업을 수행 할 수있는 방법이 있습니까? 예를 들어

, 내 현재의 숨겨 놓은 목록은 다음과 같습니다

[email protected]:~/my/dev/work$ git stash list 
[email protected]{0}: WIP on master: 346f844 Commit comment 
[email protected]{1}: WIP on second_issues: a2f63e5 Commit comment 
[email protected]{2}: WIP on second_issues: c1c96a9 Commit comment 
[email protected]{3}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{4}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{5}: WIP on second_issues: d3c7949 Commit comment 
[email protected]{6}: WIP on second_issues: 9964898 Commit comment 

second_issues에서 숨겨 놨다는 모든 드롭 할 명령이 있는가?

+1

+1 매우 흥미로운 질문입니다. 숨겨진 숨김 목록은 항상 순차적일까요? –

+0

불행히도, 아니요. 많은 작업으로 바쁠 때 분기를 많이 전환하고 혼합 된 은신처로 끝나기 시작합니다. – Kevin

+0

그럴 수도 있다고 생각했는데 예제의 은신이 순차적이기 때문에 명확히하고 싶었습니다. –

답변

3

무엇? 그것은 주어진 지점에 만들어진 은신처를 떨어 뜨리는 빠르고 더러운 방법입니다.

간단히 모든 숨김을 나열하고, 분기에서 생성 된 은닉에 대해 grep을 검색하고, 은닉 이름을 얻고, 마지막으로 xargs를 통해 해당 이름 git stash drop을 전달합니다. man 페이지에 파고 편집

git stash list | grep -E '[email protected]{[0-9]+}.+ YOUR_BRANCH_NAME' | cut -d ':' -f 1 | xargs git stash drop 

, 그것은 git stash listgit log 형식 옵션을 허용했다.
그래서 우리는 단지 YOUR_BRANCHNAME과 일치하는 라인을 출력하고 그 라인의 "reflag identity name"(%gd: shortened reflag selector, e.g., [email protected]{1}, 맨 페이지에서)을 출력하도록합니다.
그런 다음 출력을 xargs에 전달하여 숨김을 삭제합니다.

git stash list --grep='YOUR_BRANCHNAME' --format='%gd' | xargs git stash drop 
2

숨김 코드는 어떤 분기에도 종속되지 않습니다. 은닉은 저장소에 숨겨진 것입니다. 각 리포지토리에는 정확히 하나의 숨김이 있지만 숨겨진 창에서 원하는대로 많은 변경 집합을 넣을 수 있으며 나중에 변경하지 않을 수 있습니다. 이와 같이 귀하의 은신처가 가지들 사이에서 다른 경우는 아닙니다. 귀하의 경우 숨겨진 @ {6}은 체크 아웃 한 지점이 무엇이든 상관없이 동일한 커밋을 보여줍니다. 은신을 지우려면 git stash clear을 실행하면 해당 repo의 모든 숨겨진 변경 사항이 숨겨집니다. 이것은 꽤 파괴적인 조작이므로 사용시주의하십시오.

+1

사실 일 수 있습니다.그러나 stash에 대한 커밋 메시지에는 커밋 된 분기가 포함됩니다. 나는 이것이 OP가 말하는 것임을 믿습니다. –

+0

MonadNewb가 맞습니다. 은폐는 모든 지점에서 볼 수 있으며 어디에서나 적용 할 수 있음을 이해합니다. 내가 만든 지사를 기준으로 은닉을 삭제하고 싶습니다. 그래도 고마워! – Kevin

+0

자, 훨씬 더 복잡한 작업입니다.'git stash list'의 결과를 보거나 실제로 .git 폴더를 횡단하여 BASH 스크립트를 작성할 필요가 있습니다. 저장된 곳에서 은닉되었습니다. 그 정보가 어디 있는지 모르겠지만,'git stash help '를 보는 것은 어떤 종류의 BASH 스크립트 없이는 불가능한 것 같습니다. – usumoio

1

은닉과 주어진 분기 간의 관계를 확인하는 한 가지 방법은 은폐의 상위 커밋이 분기에 포함되어 있는지 확인하는 것입니다.

숨김의 상위 커밋은 숨김이 작성된 커밋입니다. 관심있는 지점에 커밋이 있으면 커밋하거나 필요한 조치를 취할 수 있습니다.

당신의 숨겨 놨다 중 하나가에서 유래하는 경우가 현재 HEAD에 포함되어 커밋 감지하는 작은 bash는 스크립트가이 약

#!/bin/bash 

# Get a list of all stashes, like "[email protected]{0}", "[email protected]{1}", and so on 
stashList=$(git stash list | grep -o "^[email protected]{[0-9]*}") 

for stashRef in $stashList; do 

    # Obtain hashes for the stash and its first parent 
    currentHash=$(git rev-parse $stashRef) 
    parentHash=$(git rev-parse $stashRef^) 

    echo "$stashRef: $currentHash" 
    echo "parent: $parentHash" 

    # merge-base checks for the common parent 
    mergeBase=$(git merge-base $parentHash HEAD) 

    # If a commit is contained in another commit, it will be the base 
    # commit returned by merge-base 
    if [[ $mergeBase == $parentHash ]]; then 
     echo 'Contained in HEAD' 
    else 
     echo 'Not contained in HEAD' 
    fi 
done 
관련 문제