이전 스냅 샷을 가져 오는 경우 Git's contrib/fast-import directory의 도구 중 일부가 유용합니다. 이미 디렉토리에 각 오래된 스냅 샷이있는 경우 또는, 당신은 같은 것을 할 수 있습니다 일단
cd work && git fetch ../import master:old-history
:
# Assumes the v* glob will sort in the right order
# (i.e. zero padded, fixed width numeric fields)
# For v1, v2, v10, v11, ... you might try:
# v{1..23} (1 through 23)
# v?{,?} (v+one character, then v+two characters)
# v?{,?{,?}} (v+{one,two,three} characters)
# $(ls -v v*) (GNU ls has "version sorting")
# Or, just list them directly: ``for d in foo bar baz quux; do''
(git init import)
for d in v*; do
if mv import/.git "$d/"; then
(cd "$d" && git add --all && git commit -m"pre-Git snapshot $d")
mv "$d/.git" import/
fi
done
(cd import && git checkout HEAD -- .)
는 그런 다음 작업 저장소로 오래된 역사를 가져 오기 당신은 이전 리포지토리와 Git 기반 히스토리 모두를 동일한 리파지토리에 가지고 있습니다. 이식 작업과 대체 작업을위한 몇 가지 옵션이 있습니다.
그래프트는 다양한 기존 커밋의 상위를 편집 (일시적으로)하기위한 저장소 별 메커니즘입니다. 이식은 $GIT_DIR/info/grafts
파일 (gitrepository-layout manpage의 "info/grafts"에 설명되어 있음)에 의해 제어됩니다. 장소에 이식 (원래 초기 부모님이 없었, 이식 한 부모 준 커밋), 당신은을 통해 검색하고 확장의 역사를 볼 수있는 모든 일반 망할 놈의 도구를 사용할 수 있습니다와
INITIAL_SHA1=$(git rev-list --reverse master | head -1)
TIP_OF_OLD_HISTORY_SHA1=$(git rev-parse old-history)
echo $INITIAL_SHA1 $TIP_OF_OLD_HISTORY_SHA1 >> .git/info/grafts
(예
git log
커밋 후 이전 기록을 보여 주어야합니다).
그래프트의 주요 문제점은 저장소에 제한되어 있다는 것입니다. 그러나 그들이 역사의 영구적 인 부분으로 결정했다면 git filter-branch을 사용하여 (.git
디렉토리의 tar/zip 백업을 먼저 수행하십시오.) git filter-branch은 원래의 refs,하지만 때로는 일반 백업을 사용하는 것이 더 쉽습니다).
git filter-branch --tag-name-filter cat -- --all
rm .git/info/grafts
교체기구 (힘내 1.6.5 +) 최신이지만, 이들은 당 명령 기반 (git --no-replace-objects …
)에서 비활성화 될 수 있고 쉽게 공유 푸시 할 수있다. 대체물은 개별 객체 (얼룩, 나무, 커밋 또는 주석이 달린 태그)에서 작동하므로 메커니즘도 더 일반적입니다. 교체 메커니즘은 git replace manpage에 설명되어 있습니다. 때문에 일반성은 "prepending이"설정이 좀 더 참여하고있다 (우리는 새로운이 대신 새로운 부모를 이름의 커밋 만들어야합니다) :
# the last commit of old history branch
oldhead=$(git rev-parse --verify old-history)
# the initial commit of current branch
newinit=$(git rev-list master | tail -n 1)
# create a fake commit based on $newinit, but with a parent
# (note: at this point, $oldhead must be a full commit ID)
newfake=$(git cat-file commit "$newinit" \
| sed "/^tree [0-9a-f]\+\$/aparent $oldhead" \
| git hash-object -t commit -w --stdin)
# replace the initial commit with the fake one
git replace -f "$newinit" "$newfake"
공유이 교체 자동 없습니다.대체물을 공유하려면 refs/replace
의 일부 또는 전체를 푸시해야합니다.
git push some-remote 'refs/replace/*'
당신은 대체 영구적 자식 필터 - 지점 사용하기로 결정한 경우 (이식에서와 같이 동일, 먼저 .git
디렉토리의 타르/우편 백업을) :
git filter-branch --tag-name-filter cat -- --all
git replace -d $INITIAL_SHA1
또한 [Git에서 첫 번째/root/initial 커밋을 수정/수정/변경 하시겠습니까?] (http://stackoverflow.com/q/2119480/456814), [Git으로 프로젝트의 첫 번째 커밋을 변경 하시겠습니까?] (http://stackoverflow.com/q/2246208/456814), [힘내 : 처음/처음/루트 커밋 전에 커밋을 추가하는 방법?] (http://stackoverflow.com/q/16762160/456814). –
@Cupcake 감사합니다. 귀하의 링크에 대한 알림을 보지 못했습니다. –