我正在嘗試使用 get-commits API 端點獲取給定 git 專案的第一次提交:https ://docs.microsoft.com/en-us/rest/api/azure/devops/git/commits/get- commits?view=azure-devops-rest-6.0。
我的問題是,如果檔案已被重命名,那么重命名之前檔案的提交歷史就會丟失。從命令列使用 git,我可以添加 --follow 標志以在重命名之前回傳檔案的歷史記錄。
我找不到使用 Azure DevOps Git REST API 的等效操作。一個存在嗎?
一些附加資訊:我正在嘗試獲取給定專案的第一次提交,以便獲得該專案的第一作者。如果不先查詢提交,似乎沒有直接的方法可以讓作者獲得,這就是我試圖獲得第一個提交的原因。
編輯:鑒于 TTT 的回答,我添加了輸出以顯示 full-history simplify-merges 標志和以下標志之間的區別:
--full-history --simplify-merges
$ git log --full-history --simplify-merges -- Custom/Scripts/js_file_renamed.js
commit xxx
Author: xxx xxx <xxx.com>
Date: Mon Feb 14 12:25:49 2022 0100
Rename commit
對比
- 跟隨
$ git log --follow -- Custom/Scripts/js_file_renamed.js
commit xxx
Author: xxx xxx <[email protected]>
Date: Mon Feb 14 12:25:49 2022 0100
Rename commit
commit xxx
Author: xxx xxx <[email protected]>
Date: Mon Feb 14 11:22:29 2022 0000
Revert "Content migrated."
commit xxx
Author: xxx xxx <[email protected]>
Date: Mon Feb 14 11:20:14 2022 0000
Content migrated.
commit xxx
Author: xxx xxx <[email protected]>
Date: Mon Feb 14 12:14:08 2022 0100
Add folders
編輯2:
鑒于我還沒有找到與“git log --follow”直接等效的方法,我做了以下解決方法:
- 使用檔案的路徑和包含該檔案所在分支的專案描述符執行 GET 提交。
- 如果對檔案的最早獲得的提交更改是添加,則回傳該提交。如果是重命名,則使用提交的 ID 使用 GET 提交來獲取更詳細的帶有父提交的模型。
- 獲取第一個父提交并將差異與重命名提交進行比較以獲得檔案的先前名稱。
- 遞回,傳入檔案的前一個名稱,以及作為專案描述符的父提交 id。
在偽代碼中它看起來像這樣:
private GitCommit GetFirstCommit(GitVersionDescriptor itemVersion, string path)
{
commitQuery = new GitQueryCommitsCriteria
{
ItemVersion = itemVersion,
ItemPath = path
}
commits = GET commits(commitQuery)
firstCommit = commits.Last()
if (!firstCommit) {
return null;
}
isAdd = firstCommit.Changes.Any(y => y.ChangeType.HasFlag(VersionControlChangeType.Add));
isRename = firstCommit.Changes.Any(y => y.ChangeType.HasFlag(VersionControlChangeType.Rename));
fullCommitDetails = GET commit(firstCommit.CommitId);
if (isAdd)
{
return fullCommitDetails
}
if (isRename)
{
parentId = fullCommitDetails.Parents.First();
if (!parentId)
{
return null;
}
baseVersionDescriptor = new GitBaseVersionDescriptor() { VersionType = GitVersionType.Commit, Version = parentId };
targetVersionDescriptor = new GitTargetVersionDescriptor() { VersionType = GitVersionType.Commit, Version = firstCommit.CommitId };
diffs = GET diffs(baseVersionDescriptor, targetVersionDescriptor)
previousPath = diffs.Changes
.Where(x =>
x.ChangeType.HasFlag(VersionControlChangeType.Rename) &&
x.Item.Path == path)
.Select(x => x.SourceServerItem)
.SingleOrDefault()
if (!previousPath)
{
return null;
}
return GetFirstCommit(baseVersionDescriptor, previousPath);
}
return null;
}
uj5u.com熱心網友回復:
添加對我自己的問題的答案,因為我還沒有找到與“git log --follow”直接等效的內容。我做了以下解決方法:
- 使用檔案的路徑和包含該檔案所在分支的專案描述符執行 GET 提交。
- 如果對檔案的最早獲得的提交更改是添加,則回傳該提交。如果是重命名,則使用提交的 ID 使用 GET 提交來獲取更詳細的帶有父提交的模型。
- 獲取第一個父提交并將差異與重命名提交進行比較以獲得檔案的先前名稱。
- 遞回,傳入檔案的前一個名稱,以及作為專案描述符的父提交 id。
在偽代碼中它看起來像這樣:
private GitCommit GetFirstCommit(GitVersionDescriptor itemVersion, string path)
{
commitQuery = new GitQueryCommitsCriteria
{
ItemVersion = itemVersion,
ItemPath = path
}
commits = GET commits(commitQuery)
firstCommit = commits.Last()
if (!firstCommit) {
return null;
}
isAdd = firstCommit.Changes.Any(y => y.ChangeType.HasFlag(VersionControlChangeType.Add));
isRename = firstCommit.Changes.Any(y => y.ChangeType.HasFlag(VersionControlChangeType.Rename));
fullCommitDetails = GET commit(firstCommit.CommitId);
if (isAdd)
{
return fullCommitDetails
}
if (isRename)
{
parentId = fullCommitDetails.Parents.First();
if (!parentId)
{
return null;
}
baseVersionDescriptor = new GitBaseVersionDescriptor() { VersionType = GitVersionType.Commit, Version = parentId };
targetVersionDescriptor = new GitTargetVersionDescriptor() { VersionType = GitVersionType.Commit, Version = firstCommit.CommitId };
diffs = GET diffs(baseVersionDescriptor, targetVersionDescriptor)
previousPath = diffs.Changes
.Where(x =>
x.ChangeType.HasFlag(VersionControlChangeType.Rename) &&
x.Item.Path == path)
.Select(x => x.SourceServerItem)
.SingleOrDefault()
if (!previousPath)
{
return null;
}
return GetFirstCommit(baseVersionDescriptor, previousPath);
}
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/426185.html
標籤:混帐 天蓝色的devops azure-devops-rest-api
