2010-07-21 48 views
7

Tôi đang cố gắng để hiểu một dự án, nó giúp nhìn vào sự tiến hóa của nó bằng cách sử dụng gitk. Những gì tôi làm là kiểm tra các cam kết đầu tiên, hiểu mã, chạy thử nghiệm, đi đến cam kết tiếp theo và lặp lại. Công việc hiện tại của tôi là để kiểm tra các cam kết thông qua băm của nóLàm thế nào để bước qua kho lưu trữ git?

git checkout 79cd6 

Nhưng những gì tôi muốn là một chi nhánh nơi tôi có thể thực hiện những thay đổi của riêng tôi, và cho phép tôi để hợp nhất các cam kết từ các chi nhánh chủ, nhưng mà không cần phải tìm hash băm. Luồng công việc lý tưởng:

git checkout -b <newbranch> <first commit id of master> 
git <command to move head of current branch to next commit of master> 

Trả lời

1

Bạn có thể viết tập lệnh shell nhỏ. Một tập lệnh sẽ chạy git log --pretty=oneline | awk '{print $1;}'. Tập lệnh thứ hai (gọi là step hoặc thứ gì đó) sẽ sử dụng head, tail, wc -l. Sau đó đọc dòng cuối cùng của tệp bằng tail, tìm hiểu xem có bao nhiêu dòng trong tệp và xóa dòng cuối cùng khỏi tệp. Ugly, chắc chắn, nhưng nó sẽ làm công việc. :) (Nếu bạn muốn ít xấu xí hơn một chút, nó có thể sử dụng truncate(1) để chỉ cắt bớt dòng cuối cùng của tệp, thay vì luôn tạo các tệp tạm thời mới.)

2

Lưu số này làm ~/bin/git-next hoặc một nơi khác trong đường dẫn:

#!/bin/bash 
git co $(git rev-list --children --all | awk "/^$(git rev-parse @\{0})/ { print \$2; }") 

Điều này sẽ kiểm tra con đầu tiên của bản sửa đổi hiện tại.

Nó sẽ là rất chậm trên một repo lớn nhưng nó sẽ thực hiện công việc.

Bạn có thể sửa đổi điều này để xử lý phân nhánh khi cần.

+0

Nếu tốc độ là vấn đề, bạn có thể lưu trữ đầu ra của 'git rev-list ' và chỉ tìm dòng có HEAD hiện tại của bạn trên đó và kiểm tra dòng trước đó. – Cascabel

7

Tôi biết đây là một câu hỏi cũ, nhưng tôi muốn làm điều tương tự và tìm thấy câu trả lời để tôi nghĩ mình sẽ chia sẻ.

for commit in $(git rev-list master --reverse) 
do 
    git checkout $commit 
    read 
done 

thực hiện việc này trong một cửa sổ. Nó sẽ bắt đầu với cam kết ban đầu của bạn và tiến hành một lần mỗi lần bạn nhấn enter. Sau đó làm thử nghiệm của bạn, vv trong một vỏ khác nhau.
Nó sẽ hoạt động hoàn hảo với lịch sử tuyến tính, nhưng tôi không hoàn toàn chắc chắn nó sẽ xử lý các kết hợp như thế nào. Tôi chắc chắn nó sẽ là hợp lý, nhưng mileage của bạn có thể thay đổi một chút.

+1

Làm việc như một sự quyến rũ !! Bạn cũng có thể sử dụng 'git rev-list master^[hash của lần commit đầu tiên để thanh toán]^--reverse' nếu bạn không muốn kiểm tra toàn bộ lịch sử. – CletusW

+0

Tôi cũng sẽ thêm 'git checkout master' vào cuối để bạn quay lại đúng nhánh. – CletusW

+0

Đây là tệp bash kết quả của tôi: https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW

0

Tôi muốn có một cách dễ dàng để thực hiện các cam kết trong một nhánh để xem xét/giới thiệu mã. Đây là kịch bản nhỏ tôi đã đưa ra để tự động hóa nó. Thả sau trong một tập tin, chẳng hạn, git_step và chạy nó như vậy: git_step d17dacce8b13b2ad454003da7cbd670a06c41437

#!/bin/bash 

BASE_REV=${BASE_REV:-$1}; 
current_branch=$(git branch | grep '^*' | awk '{print $2}'); 

for rev in $(git rev-list ${BASE_REV}..HEAD | tail -r); do 
    git checkout $rev; 
    LESS='RSX' git show -p $rev; 
done; 

git checkout ${current_branch}; 

Cũng sẵn như là một gist here.

Các vấn đề liên quan