2017-05-25 72 views
1

我想在現有的存儲庫中創建分支,然後跟蹤該分支。創建分支成功,新創建的分支仍然跟蹤主分支。我嘗試了幾種不同的解決方案,但結果相同 - 創建分支,但跟蹤主分支。JGit - 無法跟蹤新創建的分支

首先我會克隆庫:

Git.cloneRepository()./*set creds*/.setURI(..).setDirectory(...).call 

到目前爲止好。

接下來,從克隆產生的git文件構建存儲庫。

FileRepositoryBuilder builder = new FileRepositoryBuilder(); 
Repository repo = builder.setGitDir(gitFile).readEnvironment().findGitDir() 
    .build(); 

在這一點上,我曾經嘗試都checkingOut的分支createBranch設置爲true,並在兩個步驟做 - 創建,然後檢查。這裏是兩步法:

git.branchCreate() 
     .setForce(true) 
     .setName(branchName) 
     .setStartPoint("origin/master") 
     .call(); 
git.checkout() 
     .setName(branchName) 
     .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK) 
     .setStartPoint("origin/"+branchName) 
     .call(); 

我曾嘗試其他的事情:

  • 設置上游模式SeetupUpstreamMode.SET_UPSTREAM
  • 設置起點BRANCHNAME上創建步
  • 沒有做單獨結帳,但在結帳時設置爲creatBranch(true)
  • 在創建和結帳之間進行推送

結果始終的.git/config文件看起來像:

[remote "origin"] 
    url = ssh://.. 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
    rebase = true 
[branch "newbranch1"] 
    remote = origin 
    merge = refs/heads/master << TRACKING master, not newbranch1 

在我與普通的git創建分支(不jgit)配置文件看起來像:

[remote "origin"] 
    url = ssh:... 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
    rebase = true 
[branch "newbranch2"] 
    remote = origin 
    merge = refs/heads/newbranch2 << WANT THIS 

任何我想如何讓我的新分支跟蹤分支而不是主分支?

使用jgit-4.6.0.201612231935

+0

所以,你要跟蹤尚不遙控器上存在的一個分支(謝謝呂迪格赫爾曼)? –

+1

請注意,'Git.cloneRepository()'返回一個'Git'實例,您可以通過'getRepository()'獲取存儲庫,不需要使用'FileRepositoryBuilder'。另外,完成後請不要忘記關閉返回的Git實例。 –

回答

1

我認爲你不能跟蹤與JGit的CreateBranchCommand一個不存在的分支。 setStartPoint()僅用於指定新分支最初應指向的位置。

但是,您可以直接操作與

StoredConfig config = repository.getConfig(); 
config.setString("branch", "newbranch", "remote", "origin"); 
config.setString("branch", "newbranch", "merge", "refs/heads/newbranch"); 
config.save(); 

庫配置這是否解決問題了嗎?

0

這裏是最後的工作代碼:

Git git = Git.cloneRepository... 

git.checkout().setCreateBranch(true).setName(branchName).call(); 

pushCmd.setRemote("origin") 
    .setRefSpecs(new RefSpec(branchName+":"+branchName)).call(); 

StoredConfig config = git.getRepository().getConfig(); 
config.setString("branch", branchName, "remote", "origin"); 
config.setString("branch", branchName, "merge", "refs/heads/" + branchName); 
config.save();