2013-07-10 26 views
11

Tôi đang có thói quen stashing những thay đổi của tôi trong git và áp dụng chúng một lần nữa với git stash apply. Điều này có lợi thế là giữ cho tôi khỏi vô tình mất một stash tôi đã thực hiện, nhưng nó cũng có nghĩa là danh sách các stashes của tôi phát triển khá nhanh chóng.Thả tất cả các stashes liên kết với một chi nhánh cụ thể

Khi tôi hoàn thành với chi nhánh, tôi quay lại danh sách stash của mình và xóa tất cả các dấu gạch ngang liên quan đến nhánh. Có cách nào để làm điều này trong một lệnh duy nhất?

Ví dụ, danh sách stash hiện tại của tôi trông như thế này:

[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 

Có một câu lệnh đó sẽ thả tất cả các loại rác từ second_issues?

+1

+1 câu hỏi rất thú vị. Các dấu gạch ngang luôn luôn được tuần tự trong 'danh sách stash git'? –

+0

Thật không may, không. Khi tôi bận rộn với rất nhiều nhiệm vụ, tôi sẽ bắt đầu chuyển đổi rất nhiều nhánh và kết thúc với những dấu gạch chéo xen kẽ. – Kevin

+0

Tôi nghĩ rằng có thể là trường hợp và muốn làm rõ kể từ khi stashes trong ví dụ là tuần tự. –

Trả lời

3

gì về điều này? Đó là một cách nhanh chóng và dơ bẩn làm giảm các stashes được tạo ra trên một nhánh cụ thể.

Nó chỉ liệt kê tất cả các dấu gạch ngang, tìm kiếm với grep cho các dấu gạch ngang được tạo trên nhánh, lấy tên stash và cuối cùng chuyển các tên đó git stash drop qua xarg.

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

Sửa

Đào trong các trang người đàn ông, nó nói git stash list cũng chấp nhận git log định dạng tùy chọn.
Vì vậy, chúng tôi yêu cầu nó in các dòng chỉ khớp với YOUR_BRANCHNAME và các dòng đó để chỉ in "tên nhận dạng phản hồi" (%gd: shortened reflag selector, e.g., [email protected]{1}, từ trang hướng dẫn).
Sau đó, chúng tôi chuyển đầu ra thành xargs để thả dấu gạch chéo.

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

Stash không phụ thuộc vào bất kỳ chi nhánh nào. Stash chỉ là stash cho kho lưu trữ của bạn. Mỗi kho lưu trữ có chính xác một stash, nhưng bạn có thể đặt bao nhiêu bộ thay đổi như bạn muốn trong một stash và nó sẽ giữ chúng cho sau này. Như vậy nó không phải là trường hợp của bạn stashes là khác nhau giữa các chi nhánh. Trong trường hợp stash của bạn @ {6} sẽ hiển thị cho bạn cùng một cam kết bất kể bạn đã kiểm tra chi nhánh nào. Nếu bạn muốn xóa stash của mình, bạn có thể chạy git stash clear và điều đó sẽ xóa tất cả các thay đổi được lưu trữ của bạn cho repo đó. Đây là một hoạt động khá phá hoại nên hãy cẩn thận khi sử dụng nó.

+1

Điều này có thể đúng.Tuy nhiên, thông điệp cam kết cho một stash bao gồm các chi nhánh nơi cam kết đã được thực hiện. Tôi tin rằng đây là những gì OP đang đề cập đến. –

+0

MonadNewb là đúng. Tôi hiểu rằng stashes có thể nhìn thấy từ bất kỳ chi nhánh nào và có thể được áp dụng ở mọi nơi. Tôi muốn xóa các dấu gạch ngang dựa trên nhánh mà tôi đã tạo chúng. Cảm ơn, mặc dù! – Kevin

+0

Được rồi, đó là một thao tác phức tạp hơn nhiều, bạn sẽ cần phải viết một tập lệnh BASH có thể làm điều đó cho bạn bằng cách xem kết quả của danh sách 'git stash' hoặc bằng cách chuyển ngang thư mục .git cho thông tin về đã được lưu trữ từ nơi được lưu trữ. Tôi không chắc nơi mà thông tin đó là, nhưng dựa xem 'git stash help' những gì bạn đang yêu cầu dường như không thể có mà không có một kịch bản BASH của một số loại. – usumoio

1

Một cách tiếp cận để kiểm tra mối quan hệ giữa một stash và một chi nhánh cụ thể là để kiểm tra xem cha mẹ cam kết của stash được chứa trong chi nhánh của bạn.

Cam kết gốc của dấu gạch chéo là cam kết từ đó stash được tạo. Nếu cam kết này có mặt trong chi nhánh bạn quan tâm, bạn có thể thả chúng hoặc thực hiện hành động cần thiết.

Có một kịch bản bash nhỏ để phát hiện nếu bất kỳ ẩn nấp của bạn có nguồn gốc từ một cam kết rằng hiện đang chứa trong HEAD:

#!/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 
Các vấn đề liên quan