<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Service Principal with Federated Credentials Can’t Access Full Repo in ADO in Administration &amp; Architecture</title>
    <link>https://community.databricks.com/t5/administration-architecture/service-principal-with-federated-credentials-can-t-access-full/m-p/137149#M4327</link>
    <description>&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;The issue stems from a fundamental architectural difference in how Databricks handles Git authentication:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Git Credential Gap&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: While your SPN successfully authenticates to Databricks via Microsoft Entra federated&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;credentials, it lacks the secondary Git credentials needed to clone the full repository from Azure DevOps at job&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;runtime.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Runtime Behavior&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: When using "Git source" for jobs, Databricks attempts to clone the repository fresh for each&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;run. SPNs don't have personal Git credentials stored like regular users do, so only the specified entry file is&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;accessible.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;This is NOT a Configuration Error&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Your setup appears correct:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; SPN has Basic access in ADO&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; SPN is in the same project groups&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Git integration shows as configured successfully&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Job source is set to a branch&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;The limitation is that Microsoft Entra federated credentials authenticate the SPN to Databricks but don't&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;automatically provide Git repository access credentials for Azure DevOps.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Recommended Solutions (In Order of Preference)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Use Workspace Files Instead of Git Source (Most Reliable)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Switch your job configuration from "Git source" to "Workspace files":&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- Deploy code to Databricks workspace via CI/CD pipeline&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- No Git authentication needed at runtime&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- Full repository access guaranteed&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Manual Repository Clone in Entry Script (Quick Fix)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Add this to your entry file:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; subprocess&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; sys&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s3"&gt; os&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Store PAT in Databricks secrets&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;pat_token = dbutils.secrets.get(scope=&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"ado-secrets"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, key=&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"pat-token"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;repo_url = &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"&lt;A href="https://dev.azure.com/your-org/project/_git/repo" target="_blank"&gt;https://dev.azure.com/your-org/project/_git/repo&lt;/A&gt;"&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Clone with authentication&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;repo_url_with_auth = repo_url.replace(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"https://"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;f"https://{pat_token}@"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;subprocess.run([&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"git"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"clone"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"--depth"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"1"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"--branch"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"main"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;,&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;repo_url_with_auth, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"/tmp/repo"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;])&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Add to Python path&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;sys.path.insert(&lt;/SPAN&gt;&lt;SPAN class="s7"&gt;0&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'/tmp/repo'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Now import your modules&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;from&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; your_module &lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; your_function&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;3. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Use a Dedicated Service User (If SPNs Must Be Avoided)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Create a dedicated Databricks user account (not SPN) specifically for automated jobs with proper Git credentials&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;configured.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Action Items&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Immediate&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Implement Solution #2 (manual clone) to unblock your work&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Short-term&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Test Solution #1 (workspace files) in a dev environment&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;3. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Long-term&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Monitor Databricks releases for enhanced SPN Git credential support&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Verification Script&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Run this in your job to confirm the behavior:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s3"&gt; os&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; subprocess&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"="&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; * &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;50&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"DEBUGGING GIT ACCESS"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"="&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; * &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;50&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Current directory: {os.getcwd()}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Directory contents: {os.listdir('.')}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Running as: {spark.conf.get('spark.databricks.clusterUsageTags.userName')}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Check Git status&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;result = subprocess.run([&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'git'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'status'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;], capture_output=&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;True&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, text=&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;True&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;if&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; result.returncode == &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;0&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"Git repository detected"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Git status: {result.stdout}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;else&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"Not in a Git repository"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Error: {result.stderr}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This issue is a known limitation in the Databricks platform rather than a misconfiguration on your part. The&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;workarounds above are standard practice for organizations using SPNs with Databricks Git-source jobs.&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 31 Oct 2025 21:47:12 GMT</pubDate>
    <dc:creator>AbhaySingh</dc:creator>
    <dc:date>2025-10-31T21:47:12Z</dc:date>
    <item>
      <title>Service Principal with Federated Credentials Can’t Access Full Repo in ADO</title>
      <link>https://community.databricks.com/t5/administration-architecture/service-principal-with-federated-credentials-can-t-access-full/m-p/136418#M4292</link>
      <description>&lt;P&gt;Good Afternoon,&lt;/P&gt;&lt;P&gt;I’m using Databricks with Git integration to Azure DevOps (ADO).&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Authentication is via &lt;STRONG&gt;Microsoft Entra federated credentials&lt;/STRONG&gt; for a &lt;STRONG&gt;service principal (SPN)&lt;/STRONG&gt;.&lt;/LI&gt;&lt;LI&gt;The SPN has &lt;STRONG&gt;Basic access&lt;/STRONG&gt; in ADO, is in the same project groups as my user, and Git integration is configured successfully.&lt;/LI&gt;&lt;LI&gt;When I run jobs &lt;STRONG&gt;as my user&lt;/STRONG&gt;, the entire repo is accessible.&lt;/LI&gt;&lt;LI&gt;When I run jobs &lt;STRONG&gt;as the SPN&lt;/STRONG&gt;, only the entry file specified in the job runs; other files in the repo are not accessible.&lt;/LI&gt;&lt;LI&gt;The job source is set to a &lt;STRONG&gt;branch&lt;/STRONG&gt;, not a single file.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Why does the SPN only get access to the entry file and not the full repo? Is this expected behavior for Git source jobs, or am I missing a configuration step to allow full repo checkout when using a service principal? Has anyone else experienced similar issues?&lt;BR /&gt;&lt;BR /&gt;I followed steps outlined here:&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/azure/databricks/repos/automate-with-ms-entra" target="_blank"&gt;Use a Microsoft Entra service principal for automation with Azure Databricks Git folders - Azure Databricks | Microsoft Learn&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;from this release:&amp;nbsp;&lt;A href="https://www.databricks.com/blog/oauth-20-git-credential-support-service-principals-now-generally-available" target="_blank"&gt;OAuth 2.0 Git credential support for Service Principals is now Generally Available | Databricks Blog&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Thanks for reading!&lt;/P&gt;</description>
      <pubDate>Tue, 28 Oct 2025 14:47:22 GMT</pubDate>
      <guid>https://community.databricks.com/t5/administration-architecture/service-principal-with-federated-credentials-can-t-access-full/m-p/136418#M4292</guid>
      <dc:creator>PearceR</dc:creator>
      <dc:date>2025-10-28T14:47:22Z</dc:date>
    </item>
    <item>
      <title>Re: Service Principal with Federated Credentials Can’t Access Full Repo in ADO</title>
      <link>https://community.databricks.com/t5/administration-architecture/service-principal-with-federated-credentials-can-t-access-full/m-p/137149#M4327</link>
      <description>&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;The issue stems from a fundamental architectural difference in how Databricks handles Git authentication:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Git Credential Gap&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: While your SPN successfully authenticates to Databricks via Microsoft Entra federated&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;credentials, it lacks the secondary Git credentials needed to clone the full repository from Azure DevOps at job&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;runtime.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Runtime Behavior&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: When using "Git source" for jobs, Databricks attempts to clone the repository fresh for each&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;run. SPNs don't have personal Git credentials stored like regular users do, so only the specified entry file is&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;accessible.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;This is NOT a Configuration Error&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Your setup appears correct:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; SPN has Basic access in ADO&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; SPN is in the same project groups&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Git integration shows as configured successfully&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- &lt;span class="lia-unicode-emoji" title=":white_heavy_check_mark:"&gt;✅&lt;/span&gt; Job source is set to a branch&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;The limitation is that Microsoft Entra federated credentials authenticate the SPN to Databricks but don't&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;automatically provide Git repository access credentials for Azure DevOps.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Recommended Solutions (In Order of Preference)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Use Workspace Files Instead of Git Source (Most Reliable)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Switch your job configuration from "Git source" to "Workspace files":&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- Deploy code to Databricks workspace via CI/CD pipeline&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- No Git authentication needed at runtime&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;- Full repository access guaranteed&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Manual Repository Clone in Entry Script (Quick Fix)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Add this to your entry file:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; subprocess&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; sys&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s3"&gt; os&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Store PAT in Databricks secrets&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;pat_token = dbutils.secrets.get(scope=&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"ado-secrets"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, key=&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"pat-token"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;repo_url = &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"&lt;A href="https://dev.azure.com/your-org/project/_git/repo" target="_blank"&gt;https://dev.azure.com/your-org/project/_git/repo&lt;/A&gt;"&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Clone with authentication&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;repo_url_with_auth = repo_url.replace(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"https://"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;f"https://{pat_token}@"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;subprocess.run([&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"git"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"clone"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"--depth"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"1"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"--branch"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"main"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;,&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;repo_url_with_auth, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"/tmp/repo"&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;])&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Add to Python path&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;sys.path.insert(&lt;/SPAN&gt;&lt;SPAN class="s7"&gt;0&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'/tmp/repo'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Now import your modules&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;from&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; your_module &lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; your_function&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p4"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s4"&gt;3. &lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Use a Dedicated Service User (If SPNs Must Be Avoided)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Create a dedicated Databricks user account (not SPN) specifically for automated jobs with proper Git credentials&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;configured.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Action Items&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;1. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Immediate&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Implement Solution #2 (manual clone) to unblock your work&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;2. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Short-term&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Test Solution #1 (workspace files) in a dev environment&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;3. &lt;/SPAN&gt;&lt;SPAN class="s2"&gt;Long-term&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;: Monitor Databricks releases for enhanced SPN Git credential support&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p3"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;Verification Script&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;Run this in your job to confirm the behavior:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s3"&gt; os&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;import&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; subprocess&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"="&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; * &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;50&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"DEBUGGING GIT ACCESS"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;"="&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; * &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;50&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Current directory: {os.getcwd()}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Directory contents: {os.listdir('.')}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Running as: {spark.conf.get('spark.databricks.clusterUsageTags.userName')}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p6"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;# Check Git status&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;result = subprocess.run([&lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'git'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, &lt;/SPAN&gt;&lt;SPAN class="s6"&gt;'status'&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;], capture_output=&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;True&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;, text=&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;True&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s5"&gt;if&lt;/SPAN&gt;&lt;SPAN class="s1"&gt; result.returncode == &lt;/SPAN&gt;&lt;SPAN class="s7"&gt;0&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"Git repository detected"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Git status: {result.stdout}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p5"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;else&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;"Not in a Git repository"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p7"&gt;&lt;SPAN class="s3"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="s8"&gt;print&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;(&lt;/SPAN&gt;&lt;SPAN class="s1"&gt;f"Error: {result.stderr}"&lt;/SPAN&gt;&lt;SPAN class="s3"&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;This issue is a known limitation in the Databricks platform rather than a misconfiguration on your part. The&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;SPAN class="s1"&gt;&lt;SPAN class="Apple-converted-space"&gt;&amp;nbsp; &lt;/SPAN&gt;workarounds above are standard practice for organizations using SPNs with Databricks Git-source jobs.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 31 Oct 2025 21:47:12 GMT</pubDate>
      <guid>https://community.databricks.com/t5/administration-architecture/service-principal-with-federated-credentials-can-t-access-full/m-p/137149#M4327</guid>
      <dc:creator>AbhaySingh</dc:creator>
      <dc:date>2025-10-31T21:47:12Z</dc:date>
    </item>
  </channel>
</rss>

