libgit2 / libgit2/libgit2sharp
Submodule project nested in submodule gives "Unable to locate repository ..."
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- C#
- Star
- 3.5k
- Fork
- 925
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
Back link to https://github.com/dotnet/sourcelink/issues/276#issuecomment-489463618
repro, running this in a docker debian 9 (netcore sdk 2.2.203) container:
#idempotent script
rm -rf ~/repo ~/submodule
# setup dirs and submodule project
mkdir -p ~/submodule/subdir && cd ~/submodule && git init && cd subdir && dotnet new classlib
# do submodule commit
git config user.email "you@example.com" && git config user.name "Your Name" && git add . && git commit -m "Initial commit"
#creat repo project
mkdir -p ~/repo/src && cd ~/repo && git init && git submodule add ~/submodule submodule && cd src && dotnet new classlib && dotnet add reference ../submodule/subdir/subdir.csproj && cd -
# Add Directory.Build.props with SourceLink reference, so submodule will get it too.
echo -e '<Project>\n <ItemGroup>\n <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" />\n </ItemGroup>\n</Project>' > Directory.Build.props
dotnet build src
This is an strace capturing opens around when the target warns that it cannot locate the directory:
[pid 1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.Operations.dll", O_RDONLY) = 119
[pid 1284] open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 120
[pid 1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/LibGit2Sharp.dll", O_RDONLY) = 120
[pid 1280] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/../tools/netcoreapp2.0/runtimes/debian.9-x64/native/libgit2-a904fc6.so", O_RDONLY|O_CLOEXEC) = 118
[pid 1280] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 118
[pid 1280] open("/usr/lib/x86_64-linux-gnu/libssl.so.1.1", O_RDONLY|O_CLOEXEC) = 118
[pid 1280] open("/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 118
[pid 1284] open("/root/.dotnet/corefx/cryptography/x509stores/my", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 118
[pid 1284] open("/root/.dotnet/corefx/cryptography/x509stores/my/2A56A5C2C6A932EAA4B04ACB89C0B77D933D53F2.pfx", O_RDONLY) = 123
[pid 1280] open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 124
[pid 1280] open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory)
/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/Microsoft.Build.Tasks.Git.targets(20,5): warning : Unable to locate repository containing directory '/repo/submodule/src'. [/repo/submodule/src/submodule.csproj]
This on the other hand is an strace around that same point after you run:
echo "gitdir: ../../.git/modules/submodule" > /repo/submodule/subdir/.git
[pid 1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.dll", O_RDONLY) = 117
[pid 1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/Microsoft.Build.Tasks.Git.Operations.dll", O_RDONLY) = 108
[pid 1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/tools/netcoreapp2.0/LibGit2Sharp.dll", O_RDONLY) = 119
[pid 1402] open("/root/.nuget/packages/microsoft.build.tasks.git/1.0.0-beta2-18618-05/build/../tools/netcoreapp2.0/runtimes/debian.9-x64/native/libgit2-a904fc6.so", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/usr/lib/x86_64-linux-gnu/libssl.so.1.1", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 121
[pid 1402] open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 1402] open("/repo/submodule/subdir/.git", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/HEAD", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/refs/heads/master", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/objects/pack/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/objects/1d/ecf60232961da48db8871270ab97b1acab642b", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
[pid 1402] open("/repo/.git/modules/submodule/config", O_RDONLY|O_CLOEXEC) = 121
Notice the [pid 1402] open("/repo/submodule/subdir/.git", O_RDONLY|O_CLOEXEC) = 121 which is then followed by a lot of good opens to the actual git directory.
I fear something is going wrong in libgit2, possibly in find_repo https://github.com/libgit2/libgit2/blob/v0.28.1/src/repository.c#L472
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Tái hiện trường hợp submodule lồng nhau trong phần nội dung issue bằng container Debian 9 và dotnet build src, sau đó kiểm tra Microsoft.Build.Tasks.Git.targets ở dòng 20 và phần triển khai find_repo trong repository.c của libgit2 quanh dòng được liên kết. So sánh việc phát hiện repository khi có và không có tệp .git của submodule; hoàn tất khi bản build tìm thấy repository lồng nhau mà không có cảnh báo và các trường hợp repository hiện có vẫn hoạt động.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- csharp, git
- Lĩnh vực
- devtools
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100