What's 는 가장 쉬운 방법을 투입하고 단일 파일을 떠나면 다른 수정을까요?

StackOverflow https://stackoverflow.com/questions/125272

문제

나는 비교적 새로운 임원 및 팀 내려고 그것은 지금에 대한 대체로 파괴.

어떻게 투입하고 단일 파일을 다른 저장을 떠나면 다른 수정 나의 작업 디렉터리 uncommitted(또는 최소한으로 밀리지 않고 다른 저장소)?

이런 우리를 위해서는 데이터베이스 마이그레이션입니다.우리가 저지를 마이그레이션스 제어에서 DBA 보고 편집할 수 있습니다 그것은 우리가 작업하는 동안에 코드를 수정하여 이동과 함께하는 데이터베이스를 마이그레이션입니다.변경되지 않은 아직 갈 준비가 우리가 원하지 않을 모두 밀어합니다.

에 파괴,나는 단순히:

svn add my_migration.sql  
# commit only the migration, but not the other files I'm working on
svn commit -m "migration notes" my_mygration.sql

과 작업을 계속합니다.

이와 함께 작동하지 않은 경우로 나를 밀어서 그것을 다른 저장,변경이 있는 경우 그것이 하지는 않았을 뽑아,그것이 나를 원한을 풀 그들의 아래,병합,그리고 커밋을 병합하여 저장소에 있습니다.커밋한 후에 병합할 수 없도록 파일을 생략 그것의 힘 투입하는 모든 로컬 저장소에.

가장 쉬운 것은 내가 알아낼 수 있습 투입한 파일을 저장,복제 로컬 저장소에 가져오는 새로운 변경 사항은 실제 저장소,병합하고 commit 는 병합,그리고 그들을 밀어 내는 변경 out.

hg add my_migration.sql 
hg commit -m "migration notes" my_migration.sql 
cd ..
hg clone project project-clone
cd project-clone
hg fetch http://hg/project
hg push  http://hg/project

이 작품은,그러나 같은 느낌이 나는 뭔가가 더 쉽고,어떤 방법을 말 mercurial 을 무시하는 파일을 이미 내에서 작업 디렉토리,그냥 하는 병합하고 보내는 파일을 따라.생각은 큐 작업을 수행 할 수 있습니다,하지만 나는 완전히 grok mq 아직입니다.

도움이 되었습니까?

해결책

Shelve 및 Unshelve 명령을 구현하는 수은 기능이있어서 나중에 보관할 변경을 지정하는 대화식 방법을 제공합니다. 선반.

그럼 당신은 할 수 있습니다 hg shelve 그리고 hg unshelve 일시적으로 변경 사항을 저장합니다. "패치 덩어리"레벨에서 작업하여 선반에 대체 할 항목을 선택하고 선택할 수 있습니다. 추가를 위해 나열된 파일을 선반하는 것처럼 보이지 않았으며, 이미 수정 된 리포지토리에 이미 파일 만 있습니다.

Mercurial에 "확장"으로 포함되어있어 HG 구성 파일에서 활성화해야합니다.


실제로 오래된 버전의 Mercurial에 대한 메모 (Shelve가 포함되기 전 - 더 이상 필요하지 않습니다) :

나는 인터넷 검색으로 훌륭한 설치 지침을 보지 못했기 때문에 여기에 작동하는 데 사용한 것들이 있습니다.

가져 가기 :

hg clone http://freehg.org/u/tksoh/hgshelve/ hgshelve

프로젝트의 유일한 파일 (현재)은 hgshelve.py 파일입니다.

~/.hgrc를 수정하여 선반 확장을 추가하여 repo를 복제 한 위치를 가리키십시오.

[extensions] 
hgshelve=/Users/ted/Documents/workspace/hgshelve/hgshelve.py

다른 팁

원래이 질문을 제기 한 지 거의 2 년이 지났습니다. 나는 지금 다르게 할 것이다 (위의 질문 위의 의견에서 언급했듯이). 지금 내가하는 일은 대신 내 로컬 리포지토리에서 하나의 파일에 대한 변경 사항을 커밋하는 것입니다 (HG 레코드 확장을 사용하여 파일의 조각 만 커밋 할 수 있습니다).

hg commit -m "commit message" filename

그런 다음 꺼내십시오.

hg push

먼저 병합 해야하는 저장소에 다른 변경이 이루어 졌기 때문에 충돌이 발생하면 부모 개정판으로 업데이트됩니다 ( "HG Parents -r."가 무엇인지 모르는 경우) 커밋 내 다른 변화가 있으므로 두 개의 머리가 있습니다. 그런 다음 원래 단일 파일 커밋으로 되돌아 가서 변경 사항을 해당 버전으로 끌어 당기십시오. 그런 다음 변경 사항을 밀어 내십시오

hg push --rev .

단일 파일과 해당 개정의 병합 만 푸시합니다. 그런 다음 현지에서 가지고있는 두 헤드를 병합 할 수 있습니다.

이런 식으로 MQ 물건과 거부 된 덩어리의 가능성을 없애고 소스 제어에 의해 모든 것을 추적합니다. 나중에 당신이 그들을 원하지 않는다고 결정하면 "HG 스트립"개정을 할 수 있습니다.

TL; DR : 원래의 설명은 복잡해 보이지만 패치 큐를 사용하는 방법을 완전히 설명하기를 바랍니다. 짧은 버전은 다음과 같습니다.

$ hg qnew -m "migration notes" -f migration my_migration.sql
$ hg qnew -f working-code
# make some changes to your code
$ hg qrefresh # update the patch with the changes you just made
$ hg qfinish -a # turn all the applied patches into normal hg commits

Mercurial equeues는 이런 종류의 산들 바람을 만들고 변경 사항을 더 복잡하게 조작 할 수 있습니다. 배울 가치가 있습니다.

이 상황에서 먼저 변경 사항을 철회하기 전에 현재 디렉토리의 내용을 저장하고 싶을 것입니다.

# create a patch called migration containing your migration
$ hg qnew -m "migration notes" -f migration.patch my_migration.sql
$ hg qseries -v # the current state of the patch queue, A means applied
0 A migration.patch
$ hg qnew -f working-code.patch # put the rest of the code in a patch
$ hg qseries -v
0 A migration.patch
1 A working-code.patch

이제 작업 코드에 대한 추가 작업을하겠습니다. 나는 계속할 것입니다 qseries 명시 적으로, 패치 대기열의 정신적 모델을 구축하면 목록을 계속 볼 필요가 없습니다.

$ hg qtop # show the patch we're currently editing
working-code.patch
$ ...hack, hack, hack...
$ hg diff # show the changes that have not been incorporated into the patch
blah, blah
$ hg qrefresh # update the patch with the changes you just made
$ hg qdiff # show the top patch's diff

모든 작업이 패치 대기열에 저장되었으므로, 원격 변경을당한 후에 이러한 변경 사항을 적용하고 복원 할 수 있습니다. 일반적으로 모든 패치를 적용하지 마십시오 hg qpop -a. 패치 대기열에 미치는 영향을 보여주기 위해 한 번에 하나씩 팝업 할 것입니다.

$ hg qpop # unapply the top patch, U means unapplied
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qtop
migration.patch
$ hg qpop
$ hg qseries -v
0 U migration.patch
1 U working-code.patch

이 시점에서 디렉토리에 변경 사항이없는 것처럼 보입니다. 그 일을한다 hg fetch. 이제 패치 큐 변경을 다시 밀어서 충돌이 있으면 병합 할 수 있습니다. 이것은 개념적으로 Git의 Rebase와 다소 유사합니다.

$ hg qpush # put the first patch back on
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qfinish -a # turn all the applied patches into normal hg commits
$ hg qseries -v
0 U working-code.patch
$ hg out
migration.patch commit info... blah, blah
$ hg push # push out your changes

이 시점에서 다른 지역 변경을 유지하면서 마이그레이션을 밀어 냈습니다. 다른 변경 사항은 대기열의 패치에 있습니다. 패치 대기열을 사용하여 대부분의 개인 개발을 수행하여 변경 사항을 더 잘 구성하는 데 도움이됩니다. 패치 대기열을 제거하고 일반적인 스타일로 돌아 가려면 변경 사항을 내보내고 "정상적인"머큐리리로 다시 임금을 내려야합니다.

$ hg qpush
$ hg qseries -v
0 A working-code.patch
$ hg export qtip > temp.diff
$ rm -r .hg/patches # get rid of mq from the repository entirely
$ hg import --no-commit temp.diff # apply the changes to the working directory
$ rm temp.diff

나는 개발을 위해 패치 대기열에 중독되어 있습니다 mq 가장 멋진 구현 중 하나입니다. 몇 가지 변화를 동시에 만들 수있는 능력은 실제로 커밋이 얼마나 집중되고 청소되는지를 향상시킵니다. 익숙해지는 데 시간이 걸리지 만 DVCS 워크 플로에서 엄청나게 잘 진행됩니다.

확장에 의존하지 않으려면 또 다른 옵션은 이러한 종류의 통합 작업에만 사용하는 상류 저장소의 클론을 로컬로 유지하는 것입니다.

예에서는 변경 사항을 통합/업스트림 리포지토리로 당기고 병합하여 원격 서버로 직접 푸시 할 수 있습니다.

내가 무엇을 사용하여 일반적으로 사용하는 파일

 hg commit -m "commit message" filename

는 경우에는 나중에,내가 병합 충돌 나는 아직 준비되지 않을 헌 변경,이 단계를 따른다:

1)만듭니 패치 파일입니다.

hg diff > changes.patch

2)모두 되돌리기 당신의 뛰어난되지 않은 변경사항,후 확인 패치 파일입니다.

hg revert --all

3)당기,업데이트 및 병합하여 최신 개정

hg pull -u
hg merge
hg commit -m "local merge"

4)이제 단순히 가져오는 당신의 패 다시 얻을 변경합니다.

hg import --no-commit changes.patch

사용하는 기억-no-commit 플래그에서 자동차를 저지르고 변경합니다.

당신이 가장 쉬운 말을했기 때문에 나는 종종 사용합니다 hg commit -i 전체 파일을 커밋 할 때도 (-간극). 와 함께 --interactive 명령 줄에서 전체 경로를 입력하지 않고 원하는 파일을 선택할 수 있습니다. 추가 보너스로 파일 내에 청크를 선택적으로 포함/제외 할 수도 있습니다.

그리고 그냥 hg push 새로 만든 커밋을 밀어 붙입니다.

사용에 대한 자세한 내용을 더했습니다 hg commit --interactive 이 답변에서 : https://stackoverflow.com/a/47931672/255961

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top